Ошибка «Избыточные элементы в 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 имеет неявно сгенерированный конструктор копирования, я не ожидал бы, что это будет проблемой.

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

10

Решение

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

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

17

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

Других решений пока нет …

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