【问题标题】:Why does abs(complex<int>) always return zero?为什么 abs(complex<int>) 总是返回零?
【发布时间】:2012-06-21 22:36:42
【问题描述】:

下面的VS2010代码打印0,出乎我的意料:

#include <complex>
#include <iostream>

using namespace std;

int main(void)
{
    complex<int> z(20, 200);
    cout << abs<int>(z) << endl;
    return 0;
}

当类型为double时可以正常工作。

【问题讨论】:

    标签: c++ math stl std complex-numbers


    【解决方案1】:

    根据 C++ ISO 规范,§26.2/2:

    floatdoublelong double 以外的任何类型实例化模板complex 的效果未指定。

    换句话说,当您实例化complex&lt;int&gt; 时,编译器可以为所欲为。从语言的角度来看,您在这里得到 0 的事实是完全明确的行为。

    为了比较 - 在​​ideone's version of gcc 上,此代码甚至无法编译。这是另一个完全有效的选择。

    希望这会有所帮助!

    【讨论】:

    • 咦,连我自己的实数类型都不能用?真令人失望。
    • @PaulManta- 是的,我猜不是。我不知道这是为什么。
    • 感谢您的回答。在未指定行为时返回 0、200 或 42 可能确实符合标准,但对于像我这样的临时程序员来说,这肯定是一个相当大的陷阱。
    • @Artium:只有两个陷阱:一,您没有正确阅读规范,二,编译器没有产生错误,它应该这样做。
    • 从技术上讲,这正是 unspecified behavior 的含义——他们完全没有负担做任何事情,甚至包括意外地完全按照您的预期行事,如只要它一致。
    【解决方案2】:

    在 MinGW 4.6.2 上,它打印 200

    但是,在 C++ ISO 标准第 26.2.2 节中:

    floatdoublelong double 以外的任何类型实例化模板complex 的效果未指定。

    因此,您的构建环境对complex&lt;int&gt; 表现出未定义的行为,这并不违反标准。

    正如templatetypedef 指出的那样,ideone's C99 compiler (GCC 4.3.4) 拒绝完全编译它。

    【讨论】:

    • @DeadMG - templatetypedef 的示例中使用的版本是 4.3.4,用于 C99。您的链接使用 C++0x,即版本 4.5.1,请参阅this page
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2010-09-26
    相关资源
    最近更新 更多