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.
}
Этот код не компилируется с gcc 4.8.0.
Я даже не думаю, тип decltype(x3)
, Что это? И почему поведение отличается?
#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");
}
Это скомпилируется. x3
выводится, чтобы быть std::initializer_list<int>
из-за:
Позволять
T
быть типом, который был определен для идентификатора переменнойd
, получатьP
из T […], если инициализатор является списком фигурных скобок (8.5.4), сstd::initializer_list<U>
,
Так x3
на самом деле std::initializer_list<int>
Один из способов понять это будет следующим:
std::cout << typeid(x3).name() << std::endl ;
для меня у меня был следующий вывод:
St16initializer_listIiE
Помещая это через c++filt
:
c++filt -t St16initializer_listIiE
Дает мне:
std::initializer_list<int>