【问题标题】:return const value for built-in type返回内置类型的 const 值
【发布时间】:2012-10-31 01:51:16
【问题描述】:

为内置类型返回一个 const 值是一个好的习惯吗?

原因是:

const int F()
{
}

int y;
F(x) = y;

如果返回值为 const,上述代码将无法编译。然而 如果不是,F(x) = y; 是一个非常隐蔽的错误。

既然给函数赋值没有意义,我在想 始终为内置类型返回一个 const 值是一个好习惯吗? 如果我总是为内置类型返回一个 const 值,有什么问题吗?

【问题讨论】:

  • IIRC,F(x) = y 即使没有 const 修饰符也不会编译,因为 F(x) 不是左值。
  • 对于内置的 const 实际上是多余的。 IT 曾经 是很好的建议,对于用户定义的类型,将它们作为 const 返回以匹配此行为。然而,对于 C++11 移动语义,这最终是一个糟糕的主意。所以永远不要将值作为 const 返回。 (换句话说,告诉你的调用者它是否可以改变它的值的副本并不是真的取决于你。)
  • @fred 骗子在哪里?您在询问编译器错误。但是这个问题询问了一些关于 c++ 的问题。我真的没能察觉到这种欺骗。

标签: c++ constants


【解决方案1】:

const 表示在对象的生命周期内,对象的值不会改变。

标准本身指出,因此,const 对非类或非数组纯右值没有意义。这样的表达式从不引用对象(至少如果表达式源自用户代码。语言本身可能会在引用绑定期间创建prvalues,它神奇地引用临时对象。恕我直言,不过,这些应该是xvalues)。因此,既然没有对象,就没有生命周期。因此,没有什么可以被视为“const”。

【讨论】:

    【解决方案2】:

    无论如何,分配给这种类型的函数调用是不合法的。如果我尝试,g++ 会给我这个错误消息:

    test.cpp: In function ‘int main()’:
    test.cpp:8:8: error: lvalue required as left operand of assignment
    

    因此,您无需同时声明返回值 const 即可从编译器获得合适的诊断信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多