Ошибка "Избыточные элементы в struct initializer" с равномерной инициализацией C++11

Я удивлен следующей ошибкой компилятора:

template <typename T>
struct A
{
    A(T t): t_{t} {}

    T t_;
};

struct S
{
};

int main()
{
    A<S> s{S{}};
}

Ошибка (с лязгом):

test.cpp:4:16: error: excess elements in struct initializer
    A(T t): t_{t} {}
               ^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here
    A<S> s{S{}};
         ^

GCC дает похожую ошибку.

Я бы ожидал выражения t_{t} попытаться скопировать конструкцию t_ от t, поскольку S имеет неявно сгенерированный конструктор копирования, я не ожидал бы, что это будет проблемой.

Может ли кто-нибудь объяснить, что здесь происходит?

1 ответ

Решение

S может иметь неявно сгенерированный конструктор копирования, но S это тоже что-то еще. Совокупность. Поэтому (почти) любое использование {} выполнит агрегатную инициализацию на нем. Итак, содержание {} как ожидается, будут значения для членов совокупности. А так как ваш агрегат пуст... бум.

В коде шаблона следует избегать единого синтаксиса инициализации именно по этим причинам. Для неизвестного типа T, вы не можете быть уверены, что именно {...} Сделаю.

Другие вопросы по тегам