在C++14中,由于constexpr
不再隐式地是const
,因此一个constexpr
成员函数能否修改类的数据成员:
struct myclass
{
int member;
constexpr myclass(int input): member(input) {}
constexpr void f() {member = 42;} // Is it allowed?
};
在C++14中,由于constexpr
不再隐式地是const
,因此一个constexpr
成员函数能否修改类的数据成员:
struct myclass
{
int member;
constexpr myclass(int input): member(input) {}
constexpr void f() {member = 42;} // Is it allowed?
};
其函数体应该是= delete、= default或者只包含以下内容的复合语句:
- 空语句
- static_assert声明
- typedef声明和不定义类或枚举类型的别名声明
- using声明
- using指令
- 以及恰好一个return语句;
变成了黑名单:
如果函数体为 = delete、= default 或不包含 asm 定义、goto 语句、try 块或非字面类型变量的定义,或者静态或线程存储持续时间变量的定义,或者未执行初始化,则其功能体应为复合语句。C.3.3
条款 7:声明添加了以下注释:
Change: constexpr non-static member functions are not implicitly const member functions.
Rationale: Necessary to allow constexpr member functions to mutate the object.
Effect on original feature: Valid C++ 2011 code may fail to compile in this International Standard. For example, the following code is valid in C++ 2011 but invalid in this International Standard because it declares the same member function twice with different return types:
struct S { constexpr const int &f(); int &f(); };