,我不了解以下行为:
#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引用,但是为什么引用不是文字类型呢?
答案 0 :(得分:2)
具有引用数据成员的结构不是文字类型吗?
是的,这样的结构是文字类型。
position<3, const double>(d)
不是常量表达式,因为其成员value
并不引用常量表达式的允许结果,因为value
的引用对象(即d
)既不是具有静态存储持续时间的对象,也不是函数。
常量表达式是[...]或prvalue核心常量表达式,其值满足以下约束:
- 如果该值是类类型的对象,则每个引用类型的非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,
- [...]
实体是常量表达式的允许结果,如果它是具有静态存储期限的对象,或者它是一个函数。