在c++ 14中,constexpr成员可以更改数据成员
In C++14 can a constexpr member change a data member?
在c++ 14中,由于constexpr
不再隐式地是const
, constexpr
成员函数是否可以修改类的数据成员:
struct myclass
{
int member;
constexpr myclass(int input): member(input) {}
constexpr void f() {member = 42;} // Is it allowed?
};
是的,我相信这个变化始于提案N3598: constexpr成员函数和隐式const,并最终成为N3652的一部分:放松对constexpr函数的约束,这改变了7.1.5
段3
中允许在函数体中的白名单:
它的函数体应该是= delete、= default或a只包含
的复合语句
- 空语句,
- static_assert-declarations
- 类型定义声明和别名-不定义类或枚举的声明,
- 通过声明,
- using引用
- 和一个返回语句;
到黑名单:
其函数体应为= delete、= default或不包含
的复合语句。一个asm-definition
- ,
- 一个尝试块,或者
非文字类型或静态或线程存储持续时间的变量的定义
,并在C.3.3
节第7条中增加了以下注释:
修改:constexpr非静态成员函数不是隐式const成员函数。
基本原理:允许constexpr成员函数改变对象。
对原有特性的影响:有效的c++ 2011代码可能无法编译本国际标准。例如,以下代码是有效的但在本国际标准中无效,因为它用不同的返回类型声明两次相同的成员函数:
struct S { constexpr const int &f(); int &f(); };
就我所知,是的。限制如下:from [dcl.constexpr]:
的复合语句
constexpr
函数的定义应满足以下约束:
-它不应该是虚拟的(10.3);
-返回类型应为文字类型;
-它的每个参数类型都必须是文字类型;
-其函数体应为= delete
、= default
或不包含
- asm-definition ,
- a
goto
语句- a try-block或
非文字类型或静态或线程存储持续时间的变量的定义
函数满足所有这些要求。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 重载具有 2 个相同数据类型成员的构造函数
- 是否允许在作为静态数据结构成员的lambda函数中捕获变量
- 当课程成员成员时,为什么参考会占据内存
- 使用各种数据类型成员创建对象的简便方法
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 指向数据结构成员的指针
- 在静态LIB和DLL中使用静态成员 - 成员值正在重置
- 从原始数据填充成员的正确方法是什么
- 将'std::cin'与数据结构成员结合使用
- C++ 指向成员成员的指针
- 使用在组合类中计算的数据构造成员类
- 错误:请求"cur"中的成员"成员",该成员属于非类类型节点<int>* 二叉树
- 为什么当我尝试访问 CvMat 数据结构成员的第一个元素时,我会得到这个 ^@
- 如何通过其偏移量访问私有数据私有成员
- 即使删除了调用它的对象,也能访问数据的c++成员函数
- 获取成员成员指针指向的类型
- 引用数据类成员访问模式