10

Я удивлен следующее сообщение об ошибке компилятора:«Лишние элементы структуры инициализатора» ошибка с 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{}}; 
     ^

НКУ дает аналогичную ошибку.

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

Не могли бы вы объяснить, что здесь происходит?

ответ

17

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

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

+0

«единообразный синтаксис инициализации следует избегать именно по этим причинам» ... и по многим другим причинам, таким как изменение семантики при изменении «S». – ipc

+1

@ipc: Я бы не зашел так далеко, но факт в том, что иногда это может быть сложно: –

+1

не такой унифицированный синтаксис инициализации? – zahir

 Смежные вопросы

  • Нет связанных вопросов^_^