【发布时间】:2013-09-18 19:56:02
【问题描述】:
#include <initializer_list>
using namespace std;
template<class T>
void f(initializer_list<T>)
{}
int main()
{
typeid(1); // OK
typeid(int); // OK
typeid(decltype(1)); // OK
f({1, 2}); // OK
typeid({1, 2}); // error
decltype({1, 2}) v; // error
typeid(decltype({1, 2})); // error
}
{1, 2} 是一个值吗?
如果是,为什么是 typeid({1, 2});不合法?
如果不是,为什么可以分配给一个initializer_list对象?
【问题讨论】:
-
Clang 3.4 说得很清楚。那些需要表达。
-
{1,2}不是表达式。 -
我认为标准仅/主要在对象的值上下文中使用术语值。还有表达式的值类别(如右值和左值)。
{1,2}既不是对象也不是表达式,因此我认为不能将其命名为 值。 -
@DyP prvalues 是没有对象的定义值。一个对象是通过有一个地址来定义的,把它放在左值类别中。但是,是的,初始化列表只是形成您可能想要的值的说明。
-
@Potatoswatter “一个对象是通过一个地址来定义的”,这会使临时对象成为非对象。文字显然是非对象,但具有类型和值类别。我认为说它们也有价值并没有错。但也许,它们只是是值?
标签: c++ c++11 types type-conversion initializer-list