有一个不受欢迎的 C 风格转换,我无法阻止它编译。不受欢迎的转换执行从某个类的对象到某个其他类的非常量引用的 C 样式转换。类是不相关的。同时,我喜欢支持从同一类的对象到 const 引用的 C 风格转换。我正在提供一个公共转换运算符来支持理想的演员表。在这种情况下,似乎不可能防止不受欢迎的演员阵容。
转换为非常量引用无法构建(“Sandbox::B::operator Sandbox::A &() ”(在第 30 行声明)不可访问*),不幸的是转换为 const 引用要么失败(错误:从 "Sandbox::B" 到 "const Sandbox::A" 的转换函数不止一个:function "Sandbox::B::operator const Sandbox::A &()" function "Sandbox::B::运营商沙盒::A &()" ):
#include <iostream>
#include <string>
#include <cstdlib>
namespace Sandbox {
class A {
public:
A (int i) : _x (i) { }
private:
int _x;
};
class B {
public:
B (const char* m) : _m (m), _a (std::atoi (m)) { }
/*
* This one shall be supported.
*/
operator const A& () {
return _a;
}
private:
/*
* This one shall be not supported.
* If this one is disabled both desired and undesired conversions pass the compilation.
*/
operator A& ();
const std::string _m;
const A _a;
};
}
int main () {
Sandbox::A a (1973);
Sandbox::B b ("1984");
/*
* This is the undesirable cast and it shall fail to compile.
*/
(Sandbox::A&)b;
/*
* This is the desirable cast and it shall pass the compilation.
*/
(const Sandbox::A&)b;
return 0;
}
如果我禁用运算符operator A& ()
,则构建所需和不希望的转换。
我正在使用 gcc、icc 和 MSVC 编译。我无法控制客户端代码并阻止使用 C 样式转换。