当前位置: 首页 > 知识库问答 >
问题:

什么时候非const成员可以用在constexpr成员函数中?

闻人嘉木
2023-03-14

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

错误:“TestClass::z”的值在常量表达式中不可用。}
- ^
注意:“int TestClass::z”不是const static 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

共有1个答案

秦俊友
2023-03-14

在第一种情况下,结果仅取决于函数的参数,包括用于访问< code>z的隐式< code>this。这并没有取消它作为< code>constexpr的资格——如果所有的参数都是常量表达式,那么结果也是常量表达式。

在您的示例中,它不是一个常量表达式(因为tc不是),但这无关紧要,因为它没有在需要常量表达式的上下文中使用。下面是一个示例,显示它在常量表达式中的用法:

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

在第二种情况下,结果也依赖于一个静态变量,它的值可能在程序中改变。这使它失去了资格——即使所有的参数都是常量表达式,< code>z不是,因此函数调用的结果永远不会是常量表达式。

 类似资料:
  • 在C 14中,由于<code>constexpr</code>不再是隐式<code>常量</code<,所以<code>constexpr<-code>成员函数是否可以修改类的数据成员:

  • 主要内容:const成员变量,const成员函数(常成员函数)在类中,如果你不希望某些数据被修改,可以使用 关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《 C++初始化列表》回顾。 const成员函数(常成员函数) con

  • 我试图在C类中实现一个返回模板参数的constexpr成员函数。代码应该是c 11兼容的。然而,当模板化的类还包含STL容器作为数据成员时,比如STD::vector(const expr成员函数不涉及它),我会遇到编译问题。 以下代码给出了一个最小的示例: 代码使用命令正确编译 g -std=c 14 -O3 快速测试.cpp -o 测试 -Wall clang-STD = c 11-O3 qu

  • 这是有效代码: 但是在这里,我真的很想声明和 。但是为什么呢?

  • 联机编译器URL:http://goo.gl/jni6Em 编译器:clang 3.4(带有-std=c 1y) 系统:Linux 3.2 如果删除L2,则编译此代码。如果我添加L2,编译器会抱怨“常量表达式中不允许修改常量限定类型‘const int‘的对象”。我不是语言律师,所以我不确定这是否属实。然而,若确实如此,为什么编译器并没有抱怨L1,因为它也将A()作为constexpr调用?这是叮

  • 问题内容: 我只是编写了一个示例程序来查看 删除此文件* 的行为 * 问题 在fun()中执行 删除操作 后,如何在fun()中使用此指针访问func_2()? 现在主要在删除该指针时如何执行 obj- > fun_2? 如果在杀死该对象后能够访问函数成员,那么为什么数据成员的数据为零‘0’? m使用linux ubuntu和g ++编译器 问题答案: 让我们将其与类似的szenario进行比较: