【发布时间】:2017-08-04 15:18:11
【问题描述】:
我正在尝试通过一种方法更改 constexpr 对象成员的值,但我不明白为什么它在这种特定情况下不起作用:
#include <iostream>
struct test
{
int m_counter = 0;
constexpr test()
{
m_counter++;
m_counter++;
increment();
increment();
increment();
}
constexpr void increment()
{
m_counter++;
}
constexpr int value() const
{
return m_counter;
}
};
template<int value>
constexpr void check()
{
std::cout << value << std::endl;
}
// constexpr test t; // value = 3, why ?
int main()
{
constexpr test t; // value = 5, ok
check<t.value()>();
}
当我在全局范围内创建对象时,我不明白为什么值为 3。 msvc 和 clang 在这两种情况下都显示 5,但 gcc 不显示。谁错了?
【问题讨论】:
-
另外,您使用的是哪个版本的 GCC?你传递给 GCC 的标志是什么?哪个版本的 Clang,以及你传递给它的标志是什么?与 MSVC++ 一样吗?最重要的是,我们需要知道您使用的是 C++11 还是 C++14?
constexpr构造函数和函数在两个标准中的行为不同(参见例如 thisconstexprreference 了解更多信息)。 -
...对我来说这可能是一个 gcc 错误
-
check是constexpr格式不正确 (NDR);无论check的模板参数如何,任何涉及标准流的东西都不能是常量表达式。 -
报告为错误#80039
标签: c++ object gcc c++14 constexpr