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++ 为什么汽车的推论不同? 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

此代码不使用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, 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>