我有以下类(class),尽可能接近我的生产代码:
#include <iostream>
template <typename T>
struct M {
M(std::string a, std::string b, T value = T(), const bool ready = false) : m_value{value}, m_ready{ ready } {}
T m_value;
bool m_ready;
};
auto main() -> int {
{
M<int> m{"a", "b"};
std::cerr << m.m_value << std::endl;
}
{
M<int> m{"a", "b", true};
std::cerr << m.m_value << std::endl;
}
}
在第一个实例中
m_value
的值正如预期的那样是 0。在第二个中它是 1,因为它采用 bool 的值。有没有办法避免转换?
最佳答案
您可以通过显式删除直接采用 bool
的版本来阻止转换。作为第三个参数:
M(std::string, std::string, bool, bool = false) = delete;
但是,如果
T
是 bool
,这会导致问题。因此,您需要使用一些 SFINAE 体操来使此定义仅在 T
时出现。可转换为 bool
但实际上不是 bool
.
关于c++ - 如何防止构造函数中的 bool 到 int 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60454262/