我的职能如下:
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临时值传递给函数时:
func(func2());我预计康斯特超载会被选中。但我得到的是:
mutable那件事怎么可能?为什么const返回值被绑定到非const rvalue引用参数?
但是,当我将const struct传递给函数时,这种情况不会发生:
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;
}结果是:
const您可以在柯尔鲁上查看这个。
康斯特void*和康斯特struct的区别是什么?
是否有一种方法可以使用特定的const值来进行重载?
发布于 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确实是一个“纯”的、短暂的值,不能已经修改过了。
https://stackoverflow.com/questions/68144057
复制相似问题