仅允许常量引用使用隐式强制转换运算符



如果对象是const,是否有方法使自定义强制转换运算符仅可用(或仅隐式(?

示例:

class Foo;
class Bar;
class MyClass {
public:
operator Foo() const;
operator Foo() = delete; // this doesn't seem to have any effect
// I also tried explicit operator Foo(); - no change
operator Bar();
};

正如您所看到的,如果MyClass是const,我希望它隐式地转换为Foo,但如果它不是const,则转换为Bar。这是因为存在一对过载函数:

void f(Foo x);
void f(Bar x);

我希望能够将MyClass传递给f,这样就可以根据它是否为常量来选择正确的函数。然而,通过这种方式,我得到了一个对重载函数的模糊调用。为什么?

int main() {
f(MyClass());
}

重要:我知道我可以通过将强制转换运算符转换为构造函数来轻松完成这项工作,但不幸的是,FooBarf无法修改。对于上下文,这是一个解决我的另一个问题的想法:有没有办法解决这种模糊的隐式强制转换运算符重载?

在检查其访问和/或删除之前,会选择最佳可行的重载。由于原始类定义没有最佳可行的重载,所以它甚至还没有达到那个阶段。也就是说,对于过载解决方案,需要解决模糊性。

使用两个转换运算符explicit中的一个确实解决了这个问题(对于测试程序,由于Bar不完整,仍然存在错误(。使用explicit(和= deleteed的组合,尽管这是可选的(转换确实会产生一个可能是要寻找的版本:

#include <iostream>
class Foo {};
class Bar {};
class MyClass {
public:
explicit operator Foo() const& = delete;
explicit operator Foo() && = delete;
operator Foo()& { return Foo(); }
explicit operator Bar() const& = delete;
operator Bar() && { return Bar(); }
explicit operator Bar() & = delete;;
};
void f(Foo) { std::cout << "f(Foo)n"; }
void f(Bar) { std::cout << "f(Bar)n"; }
int main() {
f(MyClass());
MyClass x;
f(x);
}

我没能创建一个也接受MyClass const y; f(y);的版本:使const&转换运算符不显式(对于任何一种转换(会在其他地方引起歧义。

最新更新