C ++属性应该在标题或实现中,还是两者都有?

时间:2018-03-30 17:35:53

标签: c++

我已经看了很多,但没有发现C ++属性是否应该在标题或实现中,或者两者都有。例如:

file.h

[[nodiscard]] std::future<int> get_data();

file.cpp

[[nodiscard]] std::future<int> get_data() { return ...; }

两者都有属性还是只有一个属性? examples provided by cppreference是所有函数,没有前向声明。

1 个答案:

答案 0 :(得分:5)

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

§[dcl.attr.nodiscard] / 1:

  

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

同样的基本概念也适用于大多数其他属性,但有一些属于实现 - 最明显的是[[fallthrough]]属性,它位于案例的最后一个switch语句,所以它必须位于switch语句本身所在的位置。

[[noreturn]]属性稍微具体一点。它直接要求如果一个函数被多次声明,编译器为该函数看到的 first 声明必须具有[noreturn]]属性。如果编译器在先前已声明没有它的函数上看到[[noreturn]]属性,则代码格式错误(但如果两个声明位于不同的翻译单元中则不需要诊断)。