c – VS2010中的条件运算符正确行为?
发布时间:2020-12-16 09:30:05 所属栏目:百科 来源:网络整理
导读:我想知道这段代码是否表现出正确的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 {
我想知道这段代码是否表现出正确的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修正了错误的行为还是他们引入了错误? 顺便说一句,为什么要调用复制构造函数? 解决方法
更全面的答案:
5.16 / 4和5: “4如果第二个和第三个操作数是左值并且具有相同的类型,则结果属于该类型并且是左值. 5否则结果是右值……“ 换句话说,“bool?lvalue:rvalue”会导致暂时的. 这将是它的结束,但是你将它传递给一个函数,根据C,它必须接收一个左值作为参数.因为你传递一个右值,你实际上有不是C的代码. MSVC接受它,因为它是愚蠢的,并使用一堆它没有告诉你的扩展,除非你把它变成一个挂件.因为你所拥有的不是标准的C开头,而MS只是通过扩展允许它,所以没有什么可以真正说出关于它的“正确”了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |