c++ 当使用[[nodiscribe]]和使用较低的STL选项编译时,G++没有生成警告消息

tuwxkamq  于 2023-05-13  发布在  其他
关注(0)|答案(1)|浏览(155)

c11中没有discard属性吗?如果不是,为什么g没有输出警告消息
代码如下。

//test.cpp
#include<iostream>

[[nodiscard]] int foo() {
  return 1;
}

int main() {
  std::cout<<foo()<<std::endl;
  return 0;
}

在开始的时候,我用“g++ -std=c20 test. cpp-otest.o”来完成程序,一切都很好。
但是接下来我想看看g
不支持属性nodiscribe的确切版本是什么。所以我将编译器选项改为“g++ -std=c11 -Wall test.cpp -o test2.o”,并且g和test2.o没有输出错误消息。
根据chatgpt,警告消息将显示在8.1 gcc版本和我的gcc版本是11.3.0。
不知是不是因为gcc的更新版本做了一些更新,使得较低版本的c++ stl支持呢?还是其他原因?

ia2d9nvy

ia2d9nvy1#

[dcl.attr.grammar]/6声明
对于本标准中未指定的属性令牌(包括属性范围令牌),其行为是实现定义的。任何实现无法识别的attribute-token都将被忽略。[注意:每个实现都应该为attribute-scoped-token中的attribute-namespace选择一个独特的名称。- 尾注]
因此,如果您使用的是在[[nodiscard]]被支持之前的标准或实现,它将被忽略(只要标准足够新,至少可以识别属性(C++11))
[dcl.attr.nodiscard]/2状态
除非显式强制转换为void,否则不建议将nodiscover调用作为可能计算的丢弃值表达式出现。鼓励实现在这种情况下发出警告。
在您的代码中,foo()的结果不会被丢弃;它用于std::cout<<foo()<<std::endl;的输出。

相关问题