【问题标题】:Why does clang emit these warnings?为什么 clang 会发出这些警告?
【发布时间】:2017-05-24 11:35:48
【问题描述】:

clang 编译器会为下面的 sn-p 发出警告,如 here 所示。

clang++ -std=c++14 -O0 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:1:18: warning: braces around scalar initializer [-Wbraced-scalar-init]
void point(int = {1}, int = {2}) {}
                 ^~~
main.cpp:1:29: warning: braces around scalar initializer [-Wbraced-scalar-init]
void point(int = {1}, int = {2}) {}
                            ^~~

2 warnings generated.

这是为什么?

void point(int = {1}, int = {2}) {}

int main(){
    point();
}

据我所知,{1}{2} 根据[dcl.fct.default]/1[dcl.fct]/3[dcl.init]/1 是完全有效的默认参数。

【问题讨论】:

  • 嗯,这只是一个警告,IMO 这只是意味着“嘿,这没用而且看起来很奇怪,你确定这就是你的意思吗?”。
  • @Quentin 因为这似乎是一个完全有效的代码,所以应该没有警告。
  • 有很多有效的 sn-ps 会触发警告——无效代码会触发错误。 if(x = something()); 是另一个。
  • @JoãoAfonso 如果这是有效但具有误导性(或危险)的编译器可以生成警告(cf misleading indentation gcc warning)
  • @Quentin 但是没有来自clang的警告int i = {1};

标签: c++ clang default-arguments


【解决方案1】:

大括号通常在初始化结构实例时使用,例如:

struct example {
  int member1;
  int member2;
};

example x = { 1, 2 };

Clang 告诉你,你使用大括号来初始化单个值是不“正常的”。如果您不熟悉在 C++ 中初始化值的语法,或者如果这些类型在某种重构之前是结构体,则此警告可能会有所帮助。

您可以在初始化整数时停止使用大括号,或者将-Wno-braced-scalar-init 标志传递给编译器以停止它报告警告。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多