【问题标题】:When non-const members can be used in constexpr member functions?什么时候可以在 constexpr 成员函数中使用非 const 成员?
【发布时间】:2015-06-03 15:14:11
【问题描述】:

我遇到了一个我不明白的情况。有人会很好地解释为什么第一个代码编译正确,而第二个代码出错:

错误:'TestClass::z' 的值在常量表达式中不可用
static constexpr int sum() {返回 x+y+z;}
-------------------------------------------------- --^
注意:'int TestClass::z' 不是 const 静态 int z;"

工作代码:

#include <iostream>

using namespace std;

class TestClass
{
    public:
        constexpr int sum() {return x+y+z;}

    private:
        static constexpr int x = 2;
        static const int y = 3;
        int z = 5;

};

int main()
{
    TestClass tc;
    cout << tc.sum() << endl;

    return 0;
}

但是当我尝试将 TestClass::sum() 设为静态时,我得到了上述错误:

#include <iostream>

using namespace std;

class TestClass
{
    public:
        static constexpr int sum() {return x+y+z;}

    private:
        static constexpr int x = 2;
        static const int y = 3;
        static int z;

};

int TestClass::z = 5;

int main()
{
    TestClass tc;
    cout << tc.sum() << endl;

    return 0;
}

附:我正在使用 mingw32-g++ 4.8.1

【问题讨论】:

标签: c++ class static constexpr


【解决方案1】:

在第一种情况下,结果仅取决于函数的参数,包括用于访问z 的隐式this。这并不意味着它不能成为 constexpr - 如果所有参数都是常量表达式,那么结果也是如此。

在您的示例中,它不是一个常量表达式(因为tc 不是),但这并不重要,因为它没有在需要它的上下文中使用。下面是一个例子,展示了它在常量表达式中的使用:

constexpr TestClass tc;
array<int, tc.sum()> a;
cout << a.size() << endl;

在第二种情况下,结果还取决于一个静态变量,其值可能会在程序期间发生变化。这确实取消了它的资格 - 即使所有参数都是常量表达式,z 不是,因此函数调用的结果永远不会是常量表达式。

【讨论】:

  • 嗯...但是如果我在这两种情况下都正确理解sum() 使用可以在程序执行期间更改的成员。在这两种情况下不应该做同样的事情:“忽略”constexpr?
  • @Lehu:第一种情况,如果TestClass对象是常量,它只是一个常量表达式,所以成员变量不能改变。所以constexpr 是允许的,通常的含义是“如果所有参数都是常量表达式,则产生一个常量表达式”。在第二种情况下,它永远不能是一个常量表达式,所以constexpr是不允许的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多