我不明白为什么这段代码编译时没有错误:
#include <iostream>
template <class T>
struct Test
{
static constexpr T f() {return T();}
};
int main()
{
Test<void> test;
test.f(); // Why not an error?
return 0;
}
按照标准是可以的,还是编译器的容忍度?
发布于 2013-12-09 11:15:53
这在起草C++11标准看来是有效的,如果我们看一看5.2.3
显式类型转换(函数表示法)第2段说(强调我的):
表达式T(),其中T是非数组完整对象类型或(可能为cv限定的)空类型的简单类型说明符或类型名称说明符,该表达式创建指定类型的prvalue,其值为T类型的值初始化(8.5)产生的值;对void()情况不进行初始化.
预C++11的措辞也非常相似。
这一点在一个警察中是可以的,尽管7.1.5
段3
说:
常设委员会职能的定义应满足下列限制:
包括这颗子弹:
其返回类型应为文字类型;
在C++11中,3.9
第10段并不是字面意思,但如果我们再看看第6段,就会发现一个符合这种情况的例外,它说:
如果类模板的constexpr函数模板或成员函数的实例化模板专门化将无法满足对constexpr函数或constexpr构造函数的要求,则该专门化不是constexpr函数或constexpr构造函数。注意:如果函数是成员函数,那么它仍然是const函数,如下所述。-end注意到如果模板没有专门化就会产生constexpr函数或constexpr构造函数,程序的格式是错误的;不需要诊断。
正如Casey 注意到在C++14标准草案空白中是一个字面意思一样,这是3.9
类型第10段中的内容:
如果类型是文字类型,那么它就是文字类型:
包括:
-无效;或
发布于 2013-12-09 10:56:14
详情见@的答案。
以下一段禁止使用非模板(7.1.5(3)):
constexpr
函数的定义应满足以下约束:
为了详细说明,3.9(10)中将文字类型定义为数组或结构中的标量类型或文字类型对象的组合。void
不是3.9(9)的标量类型。
发布于 2013-12-09 10:58:55
您的函数返回void()
的值,而不是从空函数本身返回。您正在返回一个NULL
值。你所做的就相当于这样:
void f() { return void(); }
这将返回一个空值,这是唯一的空值。您不能从一个void函数返回任何其他内容,因为它将是另一种类型。
https://stackoverflow.com/questions/20478193
复制相似问题