复制初始化变量时,const限定符是否有用?

时间:2013-03-15 10:26:07

标签: c++

我想知道在使用值的副本初始化非参考/指针变量时使用可选的const限定符有什么优缺点:

例如:

  • void f(const T v)代替void f(T v) // v does not need to be changed
  • if (const int err = f()) {/*...*/}代替if (int err = f()) {/*...*/}
  • 甚至void f() {const T* const v = p; /*...*/}代替void f() {const T* v = p; /*...*/}

这只是风格问题吗? C ++ 11标准在其示例中使用了什么?无法const提示编译器将变量存储在某些特殊的只读内存中(在某些实现中)?

4 个答案:

答案 0 :(得分:2)

在这种情况下const提醒自己这个变量不应该改变。因此,稍后(可能更晚),当您需要修改此函数时,您不会意外地更改变量并破坏此函数中依赖于变量不变性的其他代码。 如果变量类型(类)具有简单的构造函数,编译器将只将const变量存储在只读存储器中。

答案 1 :(得分:1)

在这3个上下文中,

const表示您无法更改变量。但如果你把它遗漏了,编译器仍然会看到你没有改变变量。现代编译器将检查变量的所有赋值,并发现只有一个初始化。

答案 2 :(得分:1)

不,这不值钱。没有基于const的编译器优化的真实示例。声明const等变量没有任何好处。

答案 3 :(得分:0)

像这样的函数原型:

void f(const T& arg);

对调用者说:“我不会更改传递的参数,尽管你通过引用传递它”

但是为了传递价值:

void f(const T arg);

传递的参数的更改对调用者是不可见的,因为正在创建副本,因此对于调用者来说,它是const是否为{1}}没有区别。但它说:“在创建参数的副本之后,此副本在执行此函数期间不会更改”,这可能对您确定要执行的人员有用此函数会将其视为常量。

但是,除了让将来会阅读它的人更容易理解您的代码设计之外,使用const限定符在这里没有多大意义。