C ++属性应该在标头中还是在实现中?

Mic*_*ith 5 c++

我已经四处查看了,没有发现C ++属性是否应该位于标头或实现中,或在两者中都存在。例如:

file.h

[[nodiscard]] std::future<int> get_data();
Run Code Online (Sandbox Code Playgroud)

file.cpp

[[nodiscard]] std::future<int> get_data() { return ...; }
Run Code Online (Sandbox Code Playgroud)

应该都具有属性还是只有一个?cppreference提供的示例都是没有前向声明的函数。

Jer*_*fin 5

为了有效,该属性需要应用于声明(即,在标头中)。如果正在编译调用,并且编译器看到的声明缺少该属性,则编译器通常将无法基于该属性发出诊断(因为它没有看到)。

§[dcl.attr.nodiscard] / 1:

属性令牌nodiscard可以应用于函数声明中的declarator-id 或类或枚举的声明。

相同的基本概念也适用于大多数其他属性,但是有一些属于实现中-最明显的是[[fallthrough]]属性,它位于switch语句中案例的末尾,因此必须位于switch语句本身的位置是。

该[[noreturn]]属性更加具体。它直接要求,如果一个函数被多次声明,则编译器为该函数看到的第一个声明必须具有该[noreturn]]属性。如果编译器看到[[noreturn]]以前没有声明的函数的属性,则代码格式错误(但是,如果两个声明位于单独的转换单元中,则无需诊断)。