Почему авто выводится по-разному?

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), Что это? И почему поведение отличается?

11

Решение

#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>,

12

Другие решения

Так 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>
6

По вопросам рекламы [email protected]