Мне интересно, демонстрирует ли этот бит кода правильное поведение C ++?
class Foo
{
public:
Foo(std::string name) : m_name(name) {}
Foo(const Foo& other) {
std::cout << "in copy constructor:" << other.GetName() << std::endl;
m_name = other.GetName();
}
std::string GetName() const { return m_name; }
void SetName(std::string name) { m_name = name; }
private:
std::string m_name;
};
Foo CreateFoo(std::string name)
{
Foo result(name);
return result;
}
void ChangeName(Foo& foo)
{
foo.SetName("foofoo");
}
int _tmain(int argc, _TCHAR* argv[])
{
Foo fooA("alan");
std::cout << "fooA name: " << fooA.GetName() << std::endl;
bool b = true;
ChangeName(b ? fooA : CreateFoo("fooB"));
std::cout << "fooA name: " << fooA.GetName() << std::endl;
return 0;
}
При сборке в VS2008 вывод:
fooA name: alan
fooA name: foofoo
Но когда тот же кодвстроен в VS2010 и становится:
fooA name: alan
in copy constructor: alan
fooA name: alan
Конструктор копирования вызывается на «alan», и, несмотря на то, что он передается по ссылке (или нет, в зависимости от обстоятельств), fooA не изменяется вызываемымChangeName
.
Изменился ли стандарт C ++, исправило ли Microsoft некорректное поведение или ввели ошибку?
Кстати, почему конструктор копированиябудучи названным ?