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>
.
所以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)