gpt4 book ai didi

c++ - 添加 initializer_list 构造函数后静默中断构造函数调用

转载 作者:IT老高 更新时间:2023-10-28 21:53:25 24 4
gpt4 key购买 nike

让我们考虑以下几点:

#include <iostream>
#include <initializer_list>

class Foo {
public:
Foo(int) {
std::cout << "with int\n";
}
};

int main() {
Foo a{10}; // new style initialization
Foo b(20); // old style initialization
}

运行时打印:

with int
with int

一切都好。现在由于新的要求,我添加了一个构造函数,它接受一个初始化列表。

Foo(std::initializer_list<int>) {
std::cout << "with initializer list\n";
}

现在打印出来了:

with initializer list
with int

所以我的旧代码 Foo a{10} 被悄悄破坏了。 a 应该使用 int 进行初始化。

我了解语言语法将 {10} 视为包含一项的列表。但是我怎样才能防止这种无声无息地破坏旧代码呢?

  1. 是否有任何编译器选项会在这种情况下向我们发出警告?因为这将是特定于编译器的,所以我对 gcc 最感兴趣。我已经尝试过-Wall -Wextra
  2. 如果没有这样的选项,那么我们是否总是需要使用旧式构造,即使用 () Foo b(20),用于其他构造函数并使用 {} 仅当我们真正指的是初始化列表时?

最佳答案

在这些情况下不可能生成任何警告,因为所呈现的选择 std::initializer_list 构造函数而不是直接匹配的行为是明确定义的并且符合标准。

Scott Meyers Effective Modern C++ book 中详细描述了此问题 第 7 项:

If, however, one or more constructors declare a parameter of type std::initializer_list, calls using the braced initialization syntax strongly prefer the overloads taking std::initializer_lists. Strongly. If there’s any way for compilers to construe a call using a braced initializer to be to a constructor taking a std::initializer_list, compilers will employ that interpretation.

他还介绍了这个问题的一些边缘案例,我强烈推荐阅读。

关于c++ - 添加 initializer_list 构造函数后静默中断构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46398411/

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