gpt4 book ai didi

c++ - 这是 Clang 的错误还是我的错误?

转载 作者:行者123 更新时间:2023-11-28 04:45:10 25 4
gpt4 key购买 nike

运行以下 C++ 程序两次。一次使用给定的析构函数,一次使用 std::fesetround(value); 从析构函数中移除。为什么我会收到不同的输出?析构函数不应该在函数 add 之后调用吗?我在 http://cpp.sh/ 上运行了两个版本和 Clang++ 6.0,以及 g++ 7.2.0。对于 g++,我还在源代码中包含了 #pragma STDC FENV_ACCESS on,没有任何改变。

#include <iostream>
#include <string>
#include <cfenv>

struct raii_feround {
raii_feround() : value(std::fegetround()) { }
~raii_feround() { std::fesetround(value); }
inline void round_up () const noexcept { std::fesetround(FE_UPWARD ); }
inline void round_down() const noexcept { std::fesetround(FE_DOWNWARD); }
template<typename T>
T add(T fst, T snd) const noexcept { return fst + snd; }
private:
int value; };

float a = 1.1;
float b = 1.2;
float c = 0;
float d = 0;

int main() {
{
raii_feround raii;
raii.round_up();
c = raii.add(a, b);
}
{
raii_feround raii;
raii.round_down();
d = raii.add(a, b);
}
std::cout << c << "\n"; // Output is: 2.3
std::cout << d << "\n"; // Output is: 2.3 or 2.29999
}

最佳答案

使用浮点环境设施需要插入#pragma STDC FENV_ACCESS on到源代码中(或确保它们默认为 on 用于您正在使用的实现。(虽然 STDC 是 C 功能,但 C++ 标准表示这些设施通过 <cfenv> header 导入到 C++ 中。)

在 cpp.sh 中这样做会导致“警告:忽略#pragma STDC FENV_ACCESS [-Wunknown-pragmas]”。

因此,cpp.sh 的编译器不支持访问和修改浮点环境。

关于c++ - 这是 Clang 的错误还是我的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49396716/

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