我有一个类,X
,它有以下构造函数:
class X{
X(int64_t, int16_t, bool, int8_t);
X(int64_t, int16_t, bool);
X(double);
X(double, FT);
explicit X(const string&);
X(const string&, Y);
};
问题是编译器一旦创建了一个只传递一个 bool 的 X 对象(假设它是允许这个的双构造函数?)并且它导致了一个问题。
为了防止这种情况,我将 bool 构造函数显式化并删除了它:
explicit X(bool) = delete;
但现在我得到了编译器错误:
EXPECT_EQUALS(X("9.8901099"), a/b);
EXPECT_EQUALS(X{"56267"}, x);
X x{"-56267E-1"};
X b("5");
编译器说我使用了 deleted 函数 explicit X(bool) = delete
如何防止从 bool 创建 X 的对象?
最佳答案
发生这种情况是因为 bool
比 std::string
更适合 const char[]
。如果您没有接受 bool
的构造函数,则选择 std::string
一个。当你有一个带有 bool
的构造函数时,就会选择这个重载。只是它被删除了,所以调用它是非法的。
让我们用一个简单的自由重载函数来观察这个行为:
auto foo(int) { cout << "foo int" << endl; }
auto foo(std::string const &) { cout << "foo string" << endl; }
auto main() -> int {
foo(3); // int
foo("Asdf"); // std::string
}
当你添加一个 bool
重载时:
auto foo(int) { cout << "foo int" << endl; }
auto foo(std::string const &) { cout << "foo string" << endl; }
auto foo(bool) { cout << "foo bool" << endl; }
auto main() -> int {
foo(3); // int
foo("Asdf"); // bool (also warning implicit conversion turn string literal into bool)
}
解决方案是添加一个char const *
重载:
auto foo(int) { cout << "foo int" << endl; }
auto foo(std::string const &) { cout << "foo string" << endl; }
auto foo(char const *s) {
cout << "foo char const *" << endl;
// possibly:
return foo(std::string{s});
}
auto foo(bool) = delete;
auto main() -> int {
foo(3); // int
foo("Asdf"); // char const *
foo(true); // error
}
因为一些遗留代码使用并返回 char *
而不是 char const *
你可能还需要添加一个 char *
重载。
关于c++ - 防止 bool 中的隐式对象构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33843885/