为什么汽车的推断方式不同?

Sun*_*min 11 c++ type-inference c++11

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.
}
Run Code Online (Sandbox Code Playgroud)

此代码无法使用gcc 4.8.0进行编译.我甚至没猜到它的类型decltype(x3).它是什么?为什么行为不同?

Jos*_*eld 12

#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");
}
Run Code Online (Sandbox Code Playgroud)

这将编译.x3推断是std::initializer_list<int>由于:

T是已经确定的可变标识符的类型d.P如果初始化程序是braced-init-list(8.5.4),则从T [...] 获取std::initializer_list<U>.


Sha*_*our 6

所以x3实际上是std::initializer_list<int>一种方法,你可以想到这一点如下:

std::cout << typeid(x3).name() << std::endl ;
Run Code Online (Sandbox Code Playgroud)

对我来说,我有以下输出:

St16initializer_listIiE
Run Code Online (Sandbox Code Playgroud)

通过这个c++filt:

c++filt -t St16initializer_listIiE
Run Code Online (Sandbox Code Playgroud)

给我:

std::initializer_list<int>
Run Code Online (Sandbox Code Playgroud)