Рассмотрим следующее:
#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), для других конструкторов и использовать{}только тогда, когда мы действительно имели в виду список инициализаторов?