В соответствии с N2628 , относящимся к c ++ 0x , инициализаторы нестатических элементов данных могут быть переопределены явно определенными конструкторами, но это выглядит немного туманным по отношению к неявно определенному конструктор копирования.
В частности, я заметил, что с версией Apple clang 3.0 поведение меняется в зависимости от того, является ли структура (или класс) POD.
Следующая программа возвращает вывод «1», который указывает, что конструктор копирования игнорирует правую часть и вместо этого подставляет новый инициализатор нестатического члена данных (в этом примере логическое значение true для X :: а).
#include <iostream>
#include <string>
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 (tags / Apple / clang-318.0.45) (на основе LLVM 3.1svn). Эта версия clang была распространена как часть Xcode 4.3 для Lion.