Когда я запускаю инструменты clang-tidy-3.8 и cppcheck-1.72, под следующим код:
#include <initializer_list>
#include <string>
#include <iostream>
using string_list = std::initializer_list<std::string>;
class Foo {
public:
explicit Foo(const string_list& strings) {
for (const auto& ss : strings) {
std::cout << ss << std::endl;
}
}
};
Выводы clang-tidy-3.8:
$> clang-tidy -checks = ‘*’ main.cpp — -std = c ++ 11
предупреждение: конструктор списка инициализаторов не должен объявляться явным образом [google-явный-конструктор] явный Foo (const string_list& строки)
Однако если я Удалить ключевое слово явный, cppcheck-1.72 сообщает:
$> cppcheck main.cpp —language = c ++ —std = c ++ 11 —enable = all
(стиль) Класс ‘Foo’ имеет конструктор с 1 аргументом, который не является явным.
Я читаю в Руководство Google Cpp:
Конструкторы, которые нельзя вызывать с одним аргументом, обычно должны опускаться явным образом. Конструкторы, которые принимают один параметр std :: initializer_list, также должны опускать явный, чтобы поддерживать инициализацию копирования (например, MyType m = {1, 2};).
Какой инструмент правильный
в соответствии со стандартом C ++?
Задача ещё не решена.
Других решений пока нет …