int x = 1; // Not Constant

class A {
    public:
        int value  = x;
        int value2 { x };
        A( int a )        : value( x ), value2( x ) {}
        A( int a, int b ) : value{ x }, value2{ x } {}
        constexpr A() : value{ 0 }, value2{ 0 } {}
};

constexpr int function( A obj1, A obj2, A obj3, A obj4, A obj5, A obj6, A obj7 ){
    return 1;
}

int main(){

    int y = 2; // Not Constant
    A obj1   ( y );
    A obj2   { y };
    A obj3 =   y  ;
    A obj4 = { y };
    A obj5   ( y, y );
    A obj6   { y, y );
    A obj7 = { y, y };
    int var = function( obj1, obj2, obj3, obj4, obj5, obj6, obj7 );

    return 0;
}

C++ 11标准(ISO/IEC 14882:2011),第3.9节,第10段规定(强调我的意思):



我认为,考虑到粗体符号,class A在C++ 11中不是文字类型,因为对于不是常量表达式的非静态数据成员,存在构造函数调用和大括号或相等初始化器。我尝试将constexpr放在构造函数定义之前,还尝试将构造函数调用分配给constexpr变量,以检查编译器是否提示,因为这些不是常量表达式。但是,Clang和GCC都可以成功编译它。所以我可能是错的。
  • 有人知道class A为什么是文字类型吗?

  • 粗体的项目符号已在C++ 14(N3652)中删除,因此我知道class A是C++ 14中的文字类型。我需要知道,因为functionconstexpr,因此是each of its parameter types shall be a literal type(C++ 11/C++ 14标准,第7.1.15节,第3段)。

    编辑:在原始帖子中,我使用了一个简单的示例以使其更易于阅读,并解释说我已经尝试了许多组合。现在,我使用其中的一些组合更新了示例,以显示我尝试了不同的构造函数调用,定义和非静态数据成员初始化。谢谢。

    最佳答案



    出于您在帖子中引用的原因,它不在C++ 11中,但在C++ 14中。然而...



    你没看错lang和gcc都不是。尽管A不是文字类型,但代码的格式确实正确……仅仅是因为没有什么要求它是文字类型。 function可能是constexpr函数,但未作为常量表达式调用。 var不是constexpr对象,因此没有强制要求所有对象均为文字类型。您是否尝试过:

    constexpr int var = function(...);
    

    那么代码将格式不正确,因为在这种情况下,function(...)将需要是一个核心常量表达式,这需要文字类型,这是在C++ 11中A失败的要求。 (实际上,在C++ 14中,您还会遇到一个问题,即A都不是constexpr对象)。

    关于c++ - C++ 11/C++ 14中的文字类型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42003583/

    10-10 21:40