c++ - 如何防止构造函数中的 bool 到 int 转换?

标签 c++ c++17

我有以下类(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;

但是,如果 Tbool ,这会导致问题。因此,您需要使用一些 SFINAE 体操来使此定义仅在 T 时出现。可转换为 bool但实际上不是 bool .

关于c++ - 如何防止构造函数中的 bool 到 int 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60454262/

相关文章:

c++ - 指向局部变量生命周期结束后的指针的编译时比较

c++ - reshape 微软的 Concurrency::diagnostic::span 也可以检测外部跨度

android - 我在哪里可以下载 cocos2d-x 预构建二进制文件?

c++ - 如何通过使用模拟最小示例来理解c++中的 "two consecutive templates"?

c++ - 没有或有静态设备上下文的 OpenGL 加载纹理?

c++ - 保证复制省略在 C++1z 的列表初始化中如何工作?

c++ - 递归模板参数删除

c++ - 从 C++ 到 C 的转换

c++ - 制作可移植代码

c++ - 如何结合就地转换和复制转换?