如何衰减作为引用传递给具有可变参数的函数的常量字符?

How can I decay const char that is passed as reference to a function with variadic parameters?

提问人:Gasim 提问时间:8/9/2022 更新时间:8/9/2022 访问量:157

问:

我有一个这样的函数:

void column(const std::string &value) { ... }

void column(float value) { ... }

template <class... TColumns> void row(const TColumns &...columns) {
  ImGui::TableNextRow();
  (column(columns), ...);
}

我正在使用 clang-tidy 静态分析器来确保我的代码始终符合 cpp 核心指南。我通过以下方式使用此功能:

// (const char[5], float)
row("Hello", 20.5f);

我的理解是,接受,但上面函数调用的第一个参数被推断为 .这会导致数组衰减,并且我收到 clang-tidy 错误:std:stringconst char *const char[5]

不要将数组隐式衰减为指针;请考虑改用 gsl::array_view 或显式强制转换

是否有可能以某种方式强制传递的字符串参数始终是 、 not 或 etc?const char *const char[5]const char[6]

c++ variadic-templates cpp-core-guidelines

评论

6赞 lorro 8/9/2022
关闭此警告怎么样?这里提供的任何解决方案都不如简单地写下你的意思。编码标准应始终谨慎使用并遵循常识。
0赞 lorro 8/9/2022
另外,如果您多次使用它,请将其设为...或者,如果您不需要所有权,请直接加入。static const std::string hello = "Hello";string_viewcolumn
0赞 no more sigsegv 8/9/2022
字符串文字是 C++ stackoverflow.com/questions/8356223/ 中的 const char[]...
1赞 NathanOliver 8/9/2022
您可以添加重载以直接使用字符串文字,而不是将它们转换为可能执行动态分配的重载。template <std::size_t N> void column(const (&value)[N])std::string
2赞 Drew Dormann 8/9/2022
您还可以添加到该行的末尾以禁用该行上的叮当声警告。虽然我同意应该禁用此警告。// NOLINT

答:

1赞 lorro 8/9/2022 #1

由于您每次到达此行都会将 c 字符串转换为字符串,因此建议使用 .预计这也将解决警告问题。static string

#include <iostream>

void column(const std::string &value) { }
void column(float value) { }

template <class... TColumns> void row(const TColumns &...columns) {
  // ...
  (column(columns), ...);
}

int main() {
    static auto hello = std::string{"Hello"};
    row(hello, 20.5f);
}

然而,最好的解决方案可能是简单地关闭警告 - 无论是全局的,还是像德鲁所写的那样,通过 .// NOLINT