c++ - 寻求对 constexpr 功能的澄清

标签 c++ function c++11 constexpr

考虑以下代码段:

#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

但是,代码可以与 B 类 的构造函数的任一定义完美编译(当前以及复制的源代码中注释掉的定义。)

为了了解这里发生了什么,我查看了以下页面:

constexpr specifier (since C++11)

Constant expressions

我必须承认,我无法弄清楚为什么成员初始值设定项列表在 A 的构造函数中是强制的,而在 B 的情况下不是。

感谢您的想法。

最佳答案

A有一个默认构造函数(顺便说一句,它是 constexpr)。 constexpr的相关要求构造函数 that you are citing如下:

for the constructor of a class or struct, ... every non-variant non-static data member must be initialized.

唯一的要求是“已初始化”。不是“显式初始化”。默认构造函数将满足初始化要求。 A有一个默认的构造函数。所以你的 Ba类成员由其默认构造函数初始化,满足此要求,因此您不必在 B 中显式初始化它的构造函数的初始化列表。

另一方面,您的花园品种 int没有默认构造函数。出于这个原因,Aconstexpr构造函数必须显式初始化它。

关于c++ - 寻求对 constexpr 功能的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58360549/

相关文章:

c++ - C++98 中的容器初始化

c++ - 像在 python 和 R 中一样单步执行 C++ 程序

c++ - 从另一个窗口显示系统菜单

python - 访问类方法内的变量

php - 问题在 Wordpress 的简码内返回一个函数

c++ - 另一个奇怪的编译器错误 : calling a templated function which gives undefined referenes

c++ - boost 灵气 搭配多种元素

c++ - C++11 中的静态导入(例如枚举类)

c++ - 互斥和变量更新

C++ 线程错误 - 类参数的编译时错误