C++ 17有一个新属性[[nodiscard]].
假设我有一个Result结构,它具有以下属性:
struct [[nodiscard]] Result {
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我调用一个返回的函数,Result如果我不检查返回的,我会收到警告Result:
Result someFunction();
int main() {
someFunction(); // warning here, as I don't check someFunction's return value
}
Run Code Online (Sandbox Code Playgroud)
该程序生成:
警告:忽略使用'nodiscard'属性声明的函数的返回值[-Wunused-result]
到现在为止还挺好.现在假设,我有一个特殊的功能,我仍然想要返回Result,但如果省略检查,我不希望生成此警告:
Result someNonCriticalFunction();
int main() {
someNonCriticalFunction(); // I don't want to generate a warning here
}
Run Code Online (Sandbox Code Playgroud)
这是因为,someNonCriticalFunction()做了一些不重要的事情(例如,类似的事情printf- 我敢打赌,没有人会一直检查其printf返回值); 大多数情况下,我不在乎它是否失败.但我还是希望它能够回归Result,就像在极少数情况下,我确实需要它Result.
有可能以某种方式这样做吗?
我不喜欢可能的解决方案:
(void)someNonCriticalFunction(),因为这个函数被调用了很多次,它很尴尬someNonCriticalFunction(),它调用(void)someNonCriticalFunction():我不想因为这个而拥有一个不同的命名函数[[nodiscard]]从Result中删除,并将其添加到每个返回的函数中ResultJoh*_*ski 34
为什么不利用header\xe2\x80\x94std::ignore中的内容来<tuple>明确丢弃:
[[nodiscard]] int MyFunction() { return 42; }\n\nint main() \n{\n std::ignore = MyFunction();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\nstd::ignore:https://en.cppreference.com/w/cpp/utility/tuple/ignore他们说计算机科学中的每个问题都可以通过添加另一层间接来解决:
template <bool nodiscard=true>
struct Result;
template <>
struct Result<false> {
// the actual implementation
};
template <>
struct [[nodiscard]] Result<true>
: Result<false>
{
using Result<false>::Result;
};
Run Code Online (Sandbox Code Playgroud)
这有效地Result有条件地进行[[nodiscard]],这允许:
Result<true> someFunction();
Result<false> someNonCriticalFunction();
int main() {
someFunction(); // warning here
someNonCriticalFunction(); // no warning here
}
Run Code Online (Sandbox Code Playgroud)
虽然真的,但这与:
[[nodiscard]]从Result中删除,并将其添加到返回Result的每个函数中
这让我开始投票.
我推荐你排除的选项:
“删除[[nodiscard]]从Result,并把它添加到每一个返回结果的功能。”
但是由于您似乎对此不满意,这里有另一种解决方案,使用沼泽标准继承:
struct [[nodiscard]] Result {
};
struct DiscardableResult: public Result {
};
Run Code Online (Sandbox Code Playgroud)
对于可以丢弃结果的函数,使用DiscardableResult作为返回类型:
Result func1();
DiscardableResult func2();
func1(); // will warn
func2(); // will not warn
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |