В соответствии с N2628, связанным с С++ 0x, инициализаторы элементов нестатического ввода могут быть переопределены явно определенными конструкторами, но он выглядит немного туманным относительно неявно определенной копии конструктор.
В частности, я заметил, что с Apple clang версии 3.0 поведение варьируется в зависимости от того, является ли структура (или класс) POD.
Следующая программа возвращает вывод "1", который указывает, что конструктор копирования игнорирует правую сторону и вместо этого заменяет новый инициализатор элемента нестатического элемента данных (в этом примере логическое истинное значение для 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" ), по-видимому, потому, что не существует неявно сгенерированного экземпляра-копии, и, следовательно, данные копируются.
Означает ли спецификация С++ 0x, что хорошая идея разрешить неявно определенному конструктору копирования не копировать содержимое правой части? Разве это не так полезно и неинтуитивно? Я считаю, что функция инициализатора нестационарного члена является довольно удобной, но если это правильное поведение, я явно избегу эту функцию из-за ее сложного и неинтуитивного поведения.
Скажите, пожалуйста, я ошибаюсь?
UPDATE: эта ошибка была исправлена в репозитории источников Clang. Смотрите revision.
UPDATE: эта ошибка появляется в Apple clang версии 3.1 (теги/Apple/clang-318.0.45) (на основе LLVM 3.1svn). Эта версия clang была распространена как часть Xcode 4.3 для Lion.