C++ 为什么汽车的推论不同? intmain(){ int x{}; 自动x2=x; 自动x3{x}; 静态断言(is_same::value,“decltype(x)与int相同”); 静态断言(is_same::value,“decltype(x2)与int相同”); static_assert(is_same::value,“decltype(x3)与int相同”);//此处出错。 }
此代码不使用gcc 4.8.0编译。 我甚至猜不出C++ 为什么汽车的推论不同? intmain(){ int x{}; 自动x2=x; 自动x3{x}; 静态断言(is_same::value,“decltype(x)与int相同”); 静态断言(is_same::value,“decltype(x2)与int相同”); static_assert(is_same::value,“decltype(x3)与int相同”);//此处出错。 },c++,c++11,type-inference,C++,C++11,Type Inference,此代码不使用gcc 4.8.0编译。 我甚至猜不出decltype(x3)的类型。这是怎么一回事?为什么行为不同?#包括 int main(){ int x{}; auto x2 = x; auto x3{x}; static_assert(is_same<int, decltype(x)>::value, "decltype(x) is the same as int"); static_assert(is_same<int, dec
decltype(x3)
的类型。这是怎么一回事?为什么行为不同?#包括
int main(){
int x{};
auto x2 = x;
auto x3{x};
static_assert(is_same<int, decltype(x)>::value, "decltype(x) is the same as int");
static_assert(is_same<int, decltype(x2)>::value, "decltype(x2) is the same as int");
static_assert(is_same<int, decltype(x3)>::value, "decltype(x3) is the same as int"); // Error here.
}
#包括
使用名称空间std;
int main(){
int x{};
自动x2=x;
自动x3{x};
静态断言(is_same::value,“decltype(x)与int相同”);
静态断言(is_same::value,“decltype(x2)与int相同”);
静态断言(is_same::value,“decltype(x3)与int相同”);
}
这将编译x3
被推断为std::初始值设定项列表
,原因如下:
让T
为变量标识符d
确定的类型。如果初始值设定项是带括号的初始值列表(8.5.4),则从T[…]获取P
,使用std::initializer\u list
因此,
x3
实际上是一个std::initializer\u list
,您可以通过以下方式了解这一点:
#include <initializer_list>
#include <type_traits>
using namespace std;
int main(){
int x{};
auto x2 = x;
auto x3{x};
static_assert(is_same<int, decltype(x)>::value, "decltype(x) is the same as int");
static_assert(is_same<int, decltype(x2)>::value, "decltype(x2) is the same as int");
static_assert(is_same<std::initializer_list<int>, decltype(x3)>::value, "decltype(x3) is the same as int");
}
通过c++过滤器
:
St16initializer_listIiE
给我:
c++filt -t St16initializer_listIiE
std::初始值设定项\u列表
声明错误…@GrijeshChauhan你能说得更具体一点吗?autox{y}
是一个std::initializer\u list
。x3实际上是一个initializer\u list
@Xeo:好的,我明白了。所以我不能使用括号初始化语法自动对吗?
c++filt -t St16initializer_listIiE
std::initializer_list<int>