4

我想知道在使用值的副本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

4 回答 4

2

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

于 2013-03-15T10:32:01.533 回答
1

const在这 3 种情况下,意味着您无法更改变量。但是如果你把它排除在外,编译器仍然会看到你没有改变变量。现代编译器将检查对变量的所有分配,并发现只有一个初始化。

于 2013-03-15T10:37:44.900 回答
1

不,这毫无价值。没有基于const. 将此类变量声明为const.

于 2013-03-15T10:45:11.473 回答
0

像这样的函数原型:

void f(const T& arg);

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

但是对于按值传递:

void f(const T arg);

调用者看不到对传递参数的更改,因为正在创建副本,因此对于调用者来说,不管它是否存在都没有区别const。但它说:“创建参数的副本后,在执行此函数期间此副本不会更改”,当您想确保将实现此函数的人将其视为持续的。

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

于 2013-03-15T10:38:46.320 回答