【问题标题】:Are the following two statements semantically same?以下两个语句在语义上是否相同?
【发布时间】:2011-01-28 12:01:14
【问题描述】:

以下两个语句在语义上是否相同?

#1 person p("Rahul", 20);

#2 person const &p = person("Rahul", 20);

编辑:

对不起,我是想问下面两个在语义上是否相同:

#1 person const p("Rahul", 20);

#2 person const &p = person("Rahul", 20);

【问题讨论】:

  • @Space_Cowboy:这是一个有效的 C++98。

标签: c++ initialization semantics


【解决方案1】:

他们不是。但是,差异仅受以下事实影响:第二种情况需要复制构造函数才能在 C++03 中访问(即使实际上并未完成复制构造函数调用)

// works with #1 fails with #2
struct f1 { f1(string, int); private: f1(f1 const&); };

【讨论】:

    【解决方案2】:

    不,他们不是。 p 在每种情况下的行为方式都是不同的。例如,在后一种情况下,您不能说:

    p.rename( "fred" );
    

    假设人有一个 rename() 方法。

    当然,如果您的第一个实例是:

    const person p("Rahul", 20);
    

    两者会更相似。我希望您不打算对所有“变量”使用引用:-)

    【讨论】:

    • 所以他们是相似的,不一样的?
    • @Rahul 对于 const 版本,我想不出办法将它们区分开来,但我相信其他人会想出办法。
    • 您可以定义对(看起来是)临时的引用,并且该临时仍然存在?我不知道。
    • 我不是在谈论创建引用,我对在创建它的语句之后临时幸存感到惊讶。当调用一个引用 temps 的函数时,表达式的计算在函数返回后结束。
    • 临时对象可以绑定到 const 引用并在引用的生命周期内持续存在,但函数参数是例外之一 - 有关详细信息,请参阅 §12.2/5。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2017-01-19
    • 2020-12-20
    相关资源
    最近更新 更多