我已经看了很多,但没有发现C ++属性是否应该在标题或实现中,或者两者都有。例如:
file.h
[[nodiscard]] std::future<int> get_data();
file.cpp
[[nodiscard]] std::future<int> get_data() { return ...; }
两者都有属性还是只有一个属性? examples provided by cppreference是所有函数,没有前向声明。
答案 0 :(得分:5)
为了有效,需要将属性应用于声明(即,在标题中)。如果正在编译调用,并且编译器看到的声明缺少该属性,编译器通常将无法基于该属性发出诊断(因为它没有看到它)。
§[dcl.attr.nodiscard] / 1:
属性标记nodiscard可以应用于函数声明中的declarator-id或类或枚举的声明。
同样的基本概念也适用于大多数其他属性,但有一些属于实现 - 最明显的是[[fallthrough]]
属性,它位于案例的最后一个switch语句,所以它必须位于switch语句本身所在的位置。
[[noreturn]]
属性稍微具体一点。它直接要求如果一个函数被多次声明,编译器为该函数看到的 first 声明必须具有[noreturn]]
属性。如果编译器在先前已声明没有它的函数上看到[[noreturn]]
属性,则代码格式错误(但如果两个声明位于不同的翻译单元中则不需要诊断)。