В C ++ 0x переопределяют ли инициализаторы нестатических элементов данных неявный конструктор копирования?

Согласно N2628 , относящемуся к , инициализаторы нестатических элементов данных могут быть переопределены явным образом определенные конструкторы, но неявно определенный конструктор копирования кажется немного туманным.

В частности, я заметил, что в Apple clang версии 3.0 поведение меняется в зависимости от того, является ли структура (или класс) POD.

Следующая программа возвращает вывод "1", который указывает, что конструктор копирования игнорирует правую часть и вместо этого подставляет новый инициализатор нестатических элементов данных (в этом примере логическое значение true для X :: а).

#include 
#include 

struct X
{
    std::string string1;
    bool a = true;
};

int main(int argc, char *argv[])
{
    X x;
    x.a = false;
    X y(x);
    std::cout << y.a << std::endl;
}

Однако, что сбивает с толку, если вы закомментируете string1:

    // std::string string1;  

, то поведение будет работать так, как я ожидал (результат - «0»), предположительно потому, что не существует неявно сгенерированного конструктора копирования, и, следовательно, данные имеют вид скопировал .

Действительно ли спецификация C ++ 0x предполагает, что неявно определенный конструктор копирования может , а не копировать содержимое правой части - это хорошая идея? Разве это не менее полезно и неинтуитивно? Я считаю, что функциональность инициализатора нестатических членов довольно удобна, но если это правильное поведение, я буду явно избегать этой функции из-за ее сложного и неинтуитивного поведения.

Скажите, пожалуйста, я ошибаюсь?

ОБНОВЛЕНИЕ: Эта ошибка исправлена ​​в репозитории исходных текстов Clang. См. Эту ревизию .

ОБНОВЛЕНИЕ: Эта ошибка исправлена ​​в Apple clang версии 3.1 (теги / Apple / clang-318.0.45) (на основе LLVM 3.1svn). Эта версия clang распространялась как часть Xcode 4.3 для Lion.

14
задан Will Bradley 3 March 2012 в 21:40
поделиться