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支持呢?还是其他原因?
1条答案
按热度按时间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;
的输出。