【发布时间】:2016-11-06 14:36:10
【问题描述】:
我一直认为 const locals 是 const 是件好事
void f() {
const resource_ptr p = get();
// ...
}
然而,上周我看到学生在做 C++ 练习并且想知道返回的 const 指针
resource_ptr f() {
const resource_ptr p = get();
// ...
return p;
}
在这里,如果编译器无法应用 NRVO(想象在某些情况下这是正确的,可能会返回两个指针之一,具体取决于条件),const 突然变得悲观,因为编译器不能从p 移动,因为它是常量。
在返回的本地人上尝试避免const 是个好主意,还是有更好的方法来处理这个问题?
【问题讨论】:
-
不能通过 as-if 规则从
const本地移动吗? -
在实践中,编译器在应用 (N)RVO 方面往往很糟糕,除了最微不足道的情况外,因此这是一个合理的担忧。一个特殊情况是当您的“局部变量”实际上是一个参数时,可悲的是禁止复制省略。
-
@Pixelchemist 这就是它的作用。它有效地在它周围放置了一个
std::move(..)。但是p是常量,所以它不会离开它。 -
如果你的类型有一个复制构造函数
Type(Type const&&),它将使用它。大多数人认为在这样的构造函数中修改参数是错误的(它是const),但并非全部,有些人认为它是一个右值更重要。无论如何,我个人避免在此类变量上使用const。 -
@juanchopanza 规范允许,但 impl 做不到
标签: c++ c++14 move-semantics nrvo