gpt4 book ai didi

c++ - 如果将不正确的参数类型传递给结构初始化器列表,为什么编译器不会生成编译错误?

转载 作者:IT老高 更新时间:2023-10-28 12:29:36 25 4
gpt4 key购买 nike

我已经定义了一个结构体,它有一个构造函数:

struct MyStruct
{
MyStruct(const int value)
: value(value)
{
}
int value;
};

以及以下对象:

int main()
{
MyStruct a (true);
MyStruct b {true};
}

但我没有收到任何编译错误,无论是 MVS2015 还是 Xcode 7.3.1。

  1. 为什么我没有收到任何编译错误?
  2. 如何让编译器帮助我检测到这一点? (最初,该结构被编写为具有 bool 数据,但一段时间后,代码更改并且 bool 变为 int 并引入了一些错误。 )

最佳答案

一个 bool可以隐式转换为 int以一种保值的方式。唯一不允许使用大括号初始化的转换是 narrowing conversions (例如反向 bool{42} )。

如果您想确保您的类可通过int 构造,那么直接的方法就是delete所有其他构造函数:

struct MyStruct
{
explicit MyStruct(int i) : value(i) { }

template <typename T>
MyStruct(T t) = delete;

int value;
};

这里,MyStruct{true}MyStruct(false)将产生对 MyStruct::MyStruct<bool> 的调用,它被定义为已删除,因此格式错误。

static_assert 相比的优势是所有类型特征实际上都会产生正确的值。例如,std::is_constructible<MyStruct, bool>std::false_type .

关于c++ - 如果将不正确的参数类型传递给结构初始化器列表,为什么编译器不会生成编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com