C++ 三个std::复杂专门化和noexcept

C++ 三个std::复杂专门化和noexcept,c++,c++11,c++14,c++17,C++,C++11,C++14,C++17,我有一个关于std::complex,std::complex和std::complex及其成员函数real()和imag()的C++17问题 显然,这些成员函数不能抛出异常,因为它们只是通过内置浮点类型的副本返回值 那么为什么不指定它们呢?有人问了一个类似的问题,但上下文略有不同。标准库通常指定的noexcept方法是仅在可能有益时才这样做。请记住,缺少noexpect规范的函数仍然可以从noexcept函数中调用(与const的类似情况不同),因此省略noexcept没有任何限制。只是,no

我有一个关于
std::complex
std::complex
std::complex
及其成员函数
real()
imag()
的C++17问题

显然,这些成员函数不能抛出异常,因为它们只是通过内置浮点类型的副本返回值


那么为什么不指定它们呢?

有人问了一个类似的问题,但上下文略有不同。标准库通常指定的
noexcept
方法是仅在可能有益时才这样做。请记住,缺少
noexpect
规范的函数仍然可以从
noexcept
函数中调用(与
const
的类似情况不同),因此省略
noexcept
没有任何限制。只是,
noexcept
向编译器指出,不需要/不可能进行异常处理,这会带来显著的性能优势,特别是在编译器只能根据函数签名对函数进行推理的情况下。然而,
std::complex::(real | imag)
无论如何都可能是内联的,在这种情况下,异常处理无论如何都可以省略


话虽如此,在这种情况下,我也看不出声明
noexcept
有任何错误。一般来说,不要声明任何库API
noexcept
,因为这可能会限制实现者。然而,在
std::complex
的情况下,实现的回旋余地非常狭窄,因此规定不能抛出任何异常是公平的。我的猜测是,
std::complex
早于
noexcept
,没有足够的理由追溯添加
noexcept
说明符。

对于任何人可以选择创建的任何其他专门化的多态性?不,这不是:“为除float、double或long double以外的任何类型实例化模板复合体的效果未指定。”谢谢。您的意思是像内联这样的编译器优化可以“纠正”像
noexcept
运算符这样的常量表达式吗?也就是说,尽管
noexcept(std::complex{}.real())<代码> >代码> false <代码>由于缺少<>代码> NOTE/<代码>说明符,因为优化编译器知道得更好,否则,仍然可以使用<代码>真的< /代码>的分支。我不知怀疑C++标准是否依赖于该概念。例如,在不静态链接的DLL中代码会发生什么?没有编译器可以优化I。在这种情况下,
noexcept
说明符将是启用
true
分支的唯一方法。