【发布时间】:2015-01-15 18:46:49
【问题描述】:
至少在“Clang”和“GCC”中。这是一个例子:
char *const InString(char *const p) {
return gets(p);
}
int main()
{
static char arr[260];
char * &&str = InString(arr); //compiles without error - what??????
}
正如你们大多数人可能知道的那样,在'main' 的第二行中,我们将临时返回值('prvalue')绑定到一个'rvalue reference',从而延长了它的生命周期。所以我的问题是这里发生了什么——返回值的“cv”真的被忽略了吗?如果是这样,在标准中这是写在哪里,否则'char *const &&'如何转换为'char * &&'?
*需要 ISO C++ 标准认证。
编辑:问题是在“C++ 11”之前,您不允许修改返回值,因为没有引入“右值”,也因为类似:
InString(arr) = nullptr;
毫无意义。但是,现在您可以延长“返回值”的生命周期,因此可以对其进行修改:
auto &&refRetVal = InString(arr);
refRetVal = nullptr;
因此,'const' return 'cv' 很有用。如果上面 'InString' 的返回类型是 'constant',那么对 'nullptr' 的第二次赋值将是非法的。
【问题讨论】:
-
返回类型中的 cv-qualifier 仅在第一级被忽略,因此
int const foo()等于int foo()但int const &foo()不等于int &foo()。除此之外,我不确定你在问什么...... -
我问的是返回值临时“prvalue”,从 C++11 开始,它的生命周期可以扩展,因此修改它变得有用,所以“const”cv。
-
@FISOCPP:总是可以通过右值表达式修改临时变量(尽管我承认存在一两个非常小的限制)。这在 C++11 中并不新鲜。只是,在您的示例中,您必须摆弄
const_cast或调用mutable成员函数来执行此操作,因为首先您只能将临时绑定到constref .但是,如果您考虑像std::cout << (std::stringstream() << 123).rdbuf();这样的简单示例,那么它会变得更加清晰。 -
"在 'C++ 11' 之前,您不允许修改返回值,因为没有引入 'rvalues'" - 完全是垃圾,C++ 一直都有 rvalues,您可以随时修改返回值
标签: c++ c++11 constants language-lawyer return-type