我遇到了我不明白的情况。有人能很好地解释为什么第一个代码编译正确,而第二个代码出错:
错误:“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
在第一种情况下,结果仅取决于函数的参数,包括用于访问< 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进行比较: