2015-02-05 3 views
3

Рассмотрим следующий пример:Clang Ошибка компиляции при инициализации по умолчанию

#include <iostream> 
#include <type_traits> 

struct A 
{ 
    //A() = default; // does neither compile with, nor without this line 
    //A(){};   // does compile with this line 
    int someVal{ 123 }; 


    void foobar(int) 
    { 
    }; 
}; 


int main() 
{ 
    const A a; 
    std::cout << "isPOD = " << std::is_pod<A>::value << std::endl; 
    std::cout << "a.someVal = " <<a.someVal << std::endl; 
} 

See Live example

Это компилировать с г ++, но не компилируется с лязгом ++, пытался с помощью следующей команды: clang++ -std=c++11 -O0 main.cpp && ./a.out

Compile ошибки из clang:

main.cpp:19:13: error: default initialization of an object of const type 'const A' requires a user-provided default constructor

Я узнал от This Stack Overflow Question, что классы, отличные от POD, получают конструктор по умолчанию. Это даже необязательно здесь, потому что переменная имеет инициализацию по умолчанию в стиле 11 ++

Почему это не для clang? Почему A() = default; не работает, тоже?

ответ

2

Вы сами процитировали ответ. В SO ответ, что вы связаны между собой, существует следующая цитата из стандартной (раздел 6.8.6precisely):

If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.

курсив мой. Линия

A() = default; 

явно не предоставляет конструктор, он делает обратное, говоря компилятору, что вы не хотите, чтобы обеспечить один, таким образом, ваш код не компилируется. Однако, как только вы предоставите конструктор путем раскопки

A(){}; 

он отлично работает. Итак, чтобы суммировать, ошибка, которую показывают clang, соответствует стандарту, а поведение gcc, вероятно, является ошибкой.

5

Это адресовано CWG issue #253, в котором обсуждается необходимость создания предоставленного пользователем конструктора для пустых объектов или объектов, чьи подобъекты полностью инициализированы (что и в вашем примере).

Цитирование часть связанного вопроса

Notes from the August, 2011 meeting:

If the implicit default constructor initializes all subobjects, no initializer should be required.

Технически это активный вопрос, но учитывая то, что обратите внимание, что вполне вероятно, что она будет решена, как GCC выбрал для его реализации.

С другой стороны, Clang имеет chosen to wait, пока проблема не будет решена до реализации решения.

In Clang, we're waiting for the issue to actually be resolved before we take a direction on it.

Таким образом, как это в настоящее время стоит, clang является правильным.

+0

Я думаю, что эта нить должна быть закрыта как дубликат предложения remyabel; возможно, напишите свой ответ на эту тему также –

+0

@MattMcNabb Ответ на Potatoswatter на другой поток более всеобъемлющий, чем мой, поэтому я не хочу добавлять к этому шум. – Praetorian

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