寻求对 constexpr 功能的澄清
seeking clarification on constexpr function
请考虑以下代码段:
#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 说明符(自 C++11 起(
常量表达式
我必须承认,我无法弄清楚为什么在 A 的构造函数的情况下强制使用成员初始值设定项列表,而不是在 B 的情况下。
欣赏你的想法。
A
有一个默认的构造函数(顺便说一下,这是constexpr
(。您引用的constexpr
构造函数的相关要求如下:
对于类或结构的构造函数,...每个非变体 必须初始化非静态数据成员。
唯一的要求是它被"初始化"。未"显式初始化"。默认构造函数将满足初始化要求。A
有一个默认构造函数。因此,B
的类成员a
由其默认构造函数初始化,满足此要求,因此您不必在B
构造函数的初始化列表中显式初始化它。
另一方面,您的花园品种int
没有默认构造函数。因此,A
的constexpr
构造函数必须显式初始化它。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 带内存和隔离功能的SQLite
- 多成员Constexpr结构初始化
- 条件constexpr函数
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 寻求对 constexpr 功能的澄清
- 在 constexpr 功能中切换
- ConstexPR模板功能的无限递归
- 如何编写工厂功能以在C 中初始化constexpr参考
- 此constexpr虚拟功能技术是否违反了任何C 11/C 14规则
- 静态初始化包含功能指针的对象的constexpr std ::数组
- 在库中展示ConstexPR专用模板功能
- 超载模板功能的constexpr别名
- ConstexPR静态模板功能:G 错误是Clang上的警告
- 在内联和 constexpr 功能的情况下"obey ODR"意味着什么?
- “constexpr”功能是否也应该是“noexcept”
- 'constexpr'功能奇怪的行为?