【发布时间】:2020-02-10 02:53:28
【问题描述】:
考虑以下代码段:
#include <iostream>
using std::cout;
using std::endl;
class A
{
public:
//constexpr A (){i = 0;}
constexpr A ():i(0){}
void show (void){cout << i << endl; return;}
private:
int i;
};
class B
{
public:
constexpr B(A a){this->a = a;}
//constexpr B(A a):a(a){}
void show (void){a.show(); return;}
private:
A a;
};
int main (void)
{
A a;
B b(a);
b.show();
return (0);
}
class A的定义内,如果当前构造函数定义被注释掉的定义替换:
//constexpr A (){i = 0;}
出现以下编译错误(注意行号与原始代码相对应):
g++ -ggdb -std=c++17 -Wall -Werror=pedantic -Wextra -c code.cpp
code.cpp: In constructor ‘constexpr A::A()’:
code.cpp:8:30: error: member ‘A::i’ must be initialized by mem-initializer in ‘constexpr’ constructor
constexpr A (){i = 0;}
^
code.cpp:12:13: note: declared here
int i;
^
make: *** [makefile:20: code.o] Error 1
但是,代码与class B 的构造函数的任一定义完美编译(当前以及复制的源代码中注释掉的定义。)
我查看了以下页面,目的是了解这里发生了什么:
constexpr specifier (since C++11)
我必须承认,我无法弄清楚为什么在 A 的构造函数的情况下,成员初始化器列表是强制性的,而不是在 B 的情况下。
欣赏你的想法。
【问题讨论】:
标签: c++ function c++11 constexpr