首页 > 解决方案 > 如何防止构造函数中的 bool 到 int 转换?

问题描述

我有以下课程,尽可能接近我的生产代码:

#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 的值。有没有办法避免转换?

标签: c++c++17

解决方案


您可以通过显式删除直接bool作为第三个参数的版本来防止转换:

M(std::string, std::string, bool, bool = false) = delete;

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


推荐阅读