加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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只是通过扩展允许它,所以没有什么可以真正说出关于它的“正确”了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读