Рассмотрим следующее:
#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}
как список с одним элементом. Но как я могу предотвратить такое молчаливое нарушение старого кода?
- Есть ли какой-либо параметр компилятора, который даст нам предупреждение о таких случаях? Поскольку это будет специфичным для компилятора, меня больше всего интересует gcc. Я уже пробовал
-Wall -Wextra
. - Если такой опции нет, нам всегда нужно использовать конструкцию старого стиля, т.е. с
()
Foo b(20)
, для других конструкторов и использовать{}
только тогда, когда мы действительно имели в виду список инициализаторов?