gpt4 book ai didi

c++ - “noexcept-expression evaluates to ‘false’ 因为调用...是什么意思?”?

转载 作者:行者123 更新时间:2023-12-05 00:44:43 27 4
gpt4 key购买 nike

考虑以下示例:

#include <chrono>

using T = std::chrono::system_clock::time_point;

struct A
{
A() = default;
explicit A(T time) : time{time}
{
}

T time{};
};

A foo()
{
return A{};
}

当我用 GCC 9.2.0 编译这段代码时,它会产生以下警告:
$ g++ -c noexcept.cpp -o noexcept.cpp.o --std=c++17 -Wnoexcept
noexcept.cpp:18:12: warning: noexcept-expression evaluates to ‘false’ because of a call to ‘constexpr std::chrono::time_point<_Clock, _Dur>::time_point() [with _Clock = std::chrono::_V2::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1, 1000000000> >]’ [-Wnoexcept]
18 | return A{};
| ^

我不明白这个警告的意思。它仅在第二个构造函数就位时生成(即使它从未被调用)。

该警告涉及正在评估的 noexcept 表达式。由于我没有看到任何这样的表达式,我想在第一个构造函数中存在类似于隐式 noexcept-expression 的东西。不过,我不明白为什么这样的事情会导致警告。如果第二个构造函数在那里,为什么会有所不同?

您能否对此有所了解并解释此代码的问题是什么?

最佳答案

您似乎明确选择加入 -Wnoexcept .标志的含义解释如下:https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html

Warn when a noexcept-expression evaluates to false because of a call to a function that does not have a non-throwing exception specification (i.e. throw() or noexcept) but is known by the compiler to never throw an exception.



在这种情况下,我不得不猜测编译器正在隐式评估一个涉及 T{} 的 noexcept 表达式。以确定 A的默认构造函数是否默认应该隐式声明 noexcept .出现警告是因为编译器可以确定 time_point 的默认构造函数从不抛出,但未声明默认构造函数 noexcept .见 here for definition .

您的代码没有问题。警告的根本原因是 time_point没有合适的 noexcept宣言。但是,对于许多标准库构造函数来说,这是正确的,并且需要很长时间来修复所有这些构造函数。因此,与此同时,此警告似乎主要增加了噪音。如果你仍然想用这个标志编译,你可以定义 A::A()自己作为 A() noexcept {} . (在这种情况下,您不会放弃琐碎,因为 T::T() 无论如何都不是微不足道的。)

关于c++ - “noexcept-expression evaluates to ‘false’ 因为调用...是什么意思?”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com