c++ - 如何防止构造函数中的 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 的值。有没有办法避免转换?
解决方案
您可以通过显式删除直接bool
作为第三个参数的版本来防止转换:
M(std::string, std::string, bool, bool = false) = delete;
但是,如果T
是bool
,那将导致问题。因此,您需要使用一些 SFINAE 体操来使此定义仅在T
可转换为bool
但实际上 bool
不是时才出现。
推荐阅读
- json - 我们可以将外部 JSON 文件复制到雪花中吗?
- jspdf - JSPDF-autotable:根据列数设置动态字体大小
- c# - Microsoft bot V4 Skill Bot 在 SendActivityAsync 函数中回复 Root bot 时响应 500(内部错误)
- python-3.x - 如果其中一个产生结果,我可以停止等待线程完成吗?
- c# - 如何使用 GTA5 的 Scripthookvdotnet 在 C# 中每秒刷新变量的值
- c# - 在 WinForms-Validating-Event 中同步异步任务
- c++ - 尝试在 Visual Studio 中构建随机项目的问题
- python - 为什么建筑系统不可用/未安装?
- asp.net-core - 无头 OrchardCMS - Grapghql 的授权问题
- angular - Angular 9 中的类成员封装