【问题标题】:Is there a way to avoid this warning from clang-tidy (fuchsia-default-arguments) while initializing a string?有没有办法在初始化字符串时避免来自 clang-tidy (fuchsia-default-arguments) 的警告?
【发布时间】:2018-12-15 11:45:46
【问题描述】:

考虑这段代码:

#include <iostream>

int main () { 
  std::string str = "not default";
  std::cout << str << std::endl;
  return 0;
}

运行clang-tidy -checks=* string.cpp 给出以下结果:

7800 warnings generated.
/tmp/clang_tidy_bug/string.cpp:4:21: warning: calling a function that uses a default argument is disallowed [fuchsia-default-arguments]
  std::string str = "not default";
                    ^
/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/bits/basic_string.h:509:39: note: default parameter was declared here
      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
                                      ^
Suppressed 7799 warnings (7799 in non-user code).

是否可以传递一些其他参数来消除此警告?我在这里并没有真正使用任何参数默认值。但是 std::string 的实现可以。

编辑:更改代码以简化测试用例。

【问题讨论】:

  • clang-tidy -checks=*,-fuchsia-default-arguments string.cpp 工作吗?
  • clang-tidy 的很多检查都是特定于某些组织的,所以我不建议打开所有检查。最好只打开你想要的检查
  • 我可以忽略这些,但我想知道是否有针对这种常见情况的编码解决方案。我发布的这段代码非常基本。我只是好奇是否有人知道另一种方法。

标签: c++ clang-tidy


【解决方案1】:

我在这里并没有真正使用任何参数默认值。但是 std::string 的实现可以。

字符串类定义了默认参数。但是通过调用构造函数来使用默认参数而不显式传递第二个参数。

是否可以传递一些其他参数来消除此警告?

是的。如果您显式传递所有参数(包括默认参数),则不会对使用默认参数发出警告。在这种情况下,您需要传递的参数是字符串构造函数的第二个参数,正如警告消息所指出的那样。它是字符串的分配器。它的类型为std::allocator&lt;char&gt;

请注意,为了在复制初始化表达式中传递多个参数,您需要使用花括号初始化列表:

std::string str = {
    "actually not default",
    std::allocator<char>(),
};

也就是说,使用默认参数通常不会被认为是一种不好的做法,并且可以说,通过保留使用并禁用警告可能会更好。但是否如此,主要是基于意见。奇怪的是,警告名称和文档都暗示警告是针对 fuchsia 代码库的,但 fuchsia 文档明确允许使用默认参数(但建议使用“判断”)。

【讨论】:

  • 谢谢。我同意用户所说的使用默认值并不是一个坏习惯。这对我来说主要是一个学术练习。我正在尝试清除我编写的一段代码的警告。我没有听说过std::allocator,现在我可以调查一下。
  • 只是在讨论中添加一点:起初我认为这个检查过于迂腐,但默认参数似乎会出现一些问题。另一方面,上面建议的代码也是不可取的。我刚刚检查过,如果我改用 std::string_view ,检查似乎不会被触发(这里没有分配器)。因此,如果适用不同的类型,这可能是另一种选择。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2019-12-31
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多