繁体   English   中英

为什么忽略返回类型'cv'?

[英]Why return-type 'cv' is ignored?

至少在'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')绑定到'右值参考',从而延长其生命周期。 所以我的问题是这里发生了什么 - 返回值的'cv'真的被忽略了,如果是这样,那么在标准中这是写的,或者'char *const &&'如何转换为'char * &&'

*需要ISO C ++标准资格。

编辑:事情是,在'C ++ 11'之前你不允许修改返回值,因为'rvalues'没有被引入,也是因为:

InString(arr) = nullptr;

毫无意义。 但是现在你可以扩展'返回值'的生命周期,因此可以修改它:

auto &&refRetVal = InString(arr);

refRetVal = nullptr;

由此可见,'const'返回'cv'非常有用。 如果上面的'InString'的返回类型是'常量',则第二次赋值为'nullptr'将是非法的。

在考虑了@dyp提到的引用之后,这是[expr] / 6:

如果prvalue最初具有类型“ cv T ”,其中T是cv-非限定的非类非数组类型, 则在进行任何进一步分析之前将表达式的类型调整为T

结论很简单:由于表达式InString(..)是一个prvalue, InString(..)的类型(它是引用的初始化器)只是简单地调整为char* ,这显然与目标兼容引用的类型(也是char* )。 换句话说,在确定函数调用表达式类型时,简单地忽略了您添加的const (但在查看函数类型本身时不会忽略它!)。

但是,对于标量prvalues,引用永远不会直接绑定到初始化表达式,但初始化临时并绑定引用:

int&& i = 4; // Temporary initialized with 4 and bound to i

int const f();
int&& ref = f(); // Initializer expression has type int - same as above

返回类型中的cv限定符仅在第一级忽略,因此int const foo()等于int foo()int const &foo()不等于int &foo()

在您的情况下,函数char *const InString()等效于char *InString()

关于char *&&str = InString(arr)的绑定。 函数的返回值是r值(临时值), str是r值引用,因此这是预期的。 当然,临时的生命周期延伸到参考范围。

顺便说一句,您的代码是用-Wextra编译的,在CLang ++中给出:

警告:返回类型的'const'类型限定符没有效果[-Wignored-qualifiers]

在G ++中:

警告:在函数返回类型[-Wignored-qualifiers]上忽略类型限定符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM