首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么const临时绑定到rvalue引用参数?

为什么const临时绑定到rvalue引用参数?
EN

Stack Overflow用户
提问于 2021-06-26 15:56:10
回答 1查看 113关注 0票数 2

我的职能如下:

代码语言:javascript
复制
void func(void * const &ptr)
{
    std::cerr << "const" << std::endl;
}

void func(void *      &&ptr)
{
    std::cerr << "mutable" << std::endl;
}

void* const func2()
{
    return nullptr;
}

一个重载采用const引用参数,另一个使用可变rvalue引用。还有一个函数返回const值。

当我将const临时值传递给函数时:

代码语言:javascript
复制
func(func2());

我预计康斯特超载会被选中。但我得到的是:

代码语言:javascript
复制
mutable

那件事怎么可能?为什么const返回值被绑定到非const rvalue引用参数?

但是,当我将const struct传递给函数时,这种情况不会发生:

代码语言:javascript
复制
struct A
{
};

void func(A const &a)
{
    std::cerr << "const" << std::endl;
}

void func(A      &&a)
{
    std::cerr << "mutable" << std::endl;
}

A const func3()
{
    return A(); 
}

int main()
{
    func(func3());
    return 0;
}

结果是:

代码语言:javascript
复制
const

您可以在柯尔鲁上查看这个。

康斯特void*和康斯特struct的区别是什么?

是否有一种方法可以使用特定的const值来进行重载?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-26 16:01:53

为什么const临时绑定到rvalue引用参数?

因为在过载解析发生的时候,这还不算什么。

expr.type 2如果一个prvalue最初的类型为“cv”,其中T是一个cv-不限定的非类、非数组类型,则表达式的类型在任何进一步分析之前都会调整为T。

类类型prvalue保留它的cv-限制,但不保留void* const prvalue。因此,重载解析与普通的void* prvalue一起发生,这解释了选择rvalue重载时所观察到的行为。

本段适用于的类型是程序实际访问其值的“基本”类型。因此,这样一个类型的prvalue确实是一个“纯”的、短暂的值,不能已经修改过了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68144057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档