具有引用数据成员的结构不是文字类型吗?

时间:2018-06-29 12:55:05

标签: c++ constexpr

,我不了解以下行为:

#include <memory>

template <int Index, typename Type>
struct position {
    using value_type = Type;

    template <typename TT>
    constexpr position( TT& val )
        : value{ val }
    {
    }

    static constexpr int index = Index;
    Type &               value;
};

int main()
{

    constexpr double d = 3.14;
    constexpr auto p1=position<3, const double>(d).value; // ok
    constexpr auto p2=position<3, const double>(d); // error
}

为什么position<3, double>(3.14).value可以是常量表达式,而position<3, double>( 3.14 )却不能?

我知道编译器希望将“ position :: value”数据成员作为const引用,但是为什么引用不是文字类型呢?

1 个答案:

答案 0 :(得分:2)

  

具有引用数据成员的结构不是文字类型吗?

是的,这样的结构是文字类型。

position<3, const double>(d)不是常量表达式,因为其成员value并不引用常量表达式的允许结果,因为value的引用对象(即d)既不是具有静态存储持续时间的对象,也不是函数。

[expr.const]/6

  

常量表达式是[...]或prvalue核心常量表达式,其值满足以下约束:

     
      
  • 如果该值是类类型的对象,则每个引用类型的非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,
  •   
  • [...]
  •   
     

实体是常量表达式的允许结果,如果它是具有静态存储期限的对象,或者它是一个函数。