c++ - 防止 bool 中的隐式对象构造?

标签 c++ constructor compiler-construction

我有一个类,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 的对象?

最佳答案

发生这种情况是因为 boolstd::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/

相关文章:

c++ - 数组中有多少个数字小于给定数字?

c++ - std::enable_if 有条件地编译一个成员函数

c++ - 将类构造函数重载放在同一类的另一个重载中

c++ - 我在哪里可以了解编译器和断言优化?

c++ - C++ 中的编译器版本、名称和操作系统检测

c++ - 链接器如何处理具有不同链接的变量?

c++ - 确定 WM_SYSCOMMAND 或 WM_ENTERMENULOOP 激活了哪些菜单项?

c++ - C++中vptr(虚拟指针)的类型

c - C中构造函数和析构函数的命名约定

javascript - 子类工厂缺少原型(prototype) - Javascript