Я удивлен следующей ошибкой компилятора:
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
имеет неявно сгенерированный конструктор копирования, я не ожидал бы, что это будет проблемой.
Может кто-нибудь объяснить, что здесь происходит?
S
может иметь неявно сгенерированный конструктор копирования, но S
это тоже что-то еще. совокупный. Поэтому (почти) любое использование {}
выполнит агрегатную инициализацию на нем. Итак, содержание {}
как ожидается, будут значения для членов совокупности. А так как ваш агрегат пуст … бум.
В коде шаблона следует избегать единого синтаксиса инициализации именно по этим причинам. Для неизвестного типа T
, вы не можете быть уверены, что именно {...}
Сделаю.
Других решений пока нет …