#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
warning: initializer-list constructor should not be declared explicit [google-explicit-constructor] explicit Foo(const string_list& strings)
然而,如果我移除关键字explicit,cppcheck-1.72报告如下:
$ > cppcheck main.cpp --language=c++ --std=c++11 --enable=all
(style) Class 'Foo' has a constructor with 1 argument that is not explicit.
我在Google Cpp Guide中看到:
不能通过单个参数调用的构造函数通常应省略explicit。具有单个std :: initializer_list参数的构造函数也应省略explicit,以支持复制初始化(例如MyType m = {1, 2};)。
按照C++标准,哪个工具是正确的?
explicit
关键字,你代码中的两种变量都是符合标准的。这些工具检查的不是是否符合标准(编译器会检查),而是是否符合风格指南 - 显然是不同的指南。你一直在说cppcheck
强制执行你所称的“C++规则”- 但请注意它的消息明确标记为(style)
。 - Igor Tandetnik