为什么下面带有非常量转换函数的代码没有歧义?
Why the following code with non-const conversion function is not ambiguous?
考虑以下代码(取自 https://en.cppreference.com/w/cpp/language/cast_operator(
struct To {
To() = default;
To(const struct From&) {} // converting constructor
};
struct From {
operator To() const {return To();} // conversion function
};
int main()
{
From f;
To t2 = f; // copy-initialization: ambiguous
// (note, if conversion function is from a non-const type, e.g.
// From::operator To();, it will be selected instead of the ctor in this case)
}
正如注释所说,下面这一行确实模棱两可,因为有两个候选者(转换函数和转换构造函数同样适用(
To t2 = f; //compile error
但是,正如注释所说,如果我从conversion
函数中删除const
,则会产生以下代码:
struct From {
operator To() {return To();} // conversion function
};
调用编译正常。const
限定符应该不会影响conversion
函数的返回值,那么为什么调用不再模棱两可呢?
const 限定符应该不会影响转换函数的返回值,那么为什么调用不再模棱两可呢?
它不会影响结果,但会影响选择最佳可行方法的过载分辨率。这类似于这些组成函数的情况
To make(From const&);
To make(From&);
make(f)
哪个重载更好?这是第二个,因为参数类型是非常量,与参数(f
(更匹配,参数本身是非常量。
const 限定符不应影响转换函数返回值
这确实不影响这一点,但这也不相关。
它确实影响的是参数 - 这是对this
的隐式引用。隐式参数是常量成员函数的常量左值和非常量成员函数的非常量左值。参数是影响重载解析的因素。
在原始代码中,构造函数和转换运算符参数完全相同,因此从任何类型到任一参数的转换序列同样可取,因此不明确。
如果没有 constf
,您的非常量左值表达式不需要任何转换,而构造函数确实需要转换为 const lvalue。因此,过载分辨率首选运算符。如果你写了const From f;
,那么参数为 const 的构造函数将被选择,因为在这种情况下,non-const 转换运算符甚至不是有效的候选者。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 为什么下面带有非常量转换函数的代码没有歧义?
- 当存在覆盖歧义函数时,代码如何运行?
- 如何解决以下代码中的函数重载歧义
- 为什么在重载区域函数时在波纹管代码的情况下会出现歧义
- 概念没有按预期解决歧义。代码示例有什么问题?
- C++代码中出现歧义错误
- C++:在编译时消除此代码的歧义
- 理解歧义解决的示例代码
- 关于歧义排列的代码问题
- 简单代码中的c++语法歧义