Согласно N2628 , относящемуся к c ++ 0x , инициализаторы нестатических элементов данных могут быть переопределены явным образом определенные конструкторы, но неявно определенный конструктор копирования кажется немного туманным.
В частности, я заметил, что в 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.