返回空白

Returning a void?

本文关键字:空白 返回      更新时间:2023-10-16

我不明白为什么这段代码编译时没有错误:

#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;
}

根据标准,它可以吗?还是编译器的容差?

根据C++11标准草案,如果我们查看5.2.3显式类型转换(函数表示法)段落2说明(emphasis mine):

表达式T(),其中T是一个简单的类型说明符或非数组完整对象类型的typename说明符或(可能是cv限定的)void类型,创建指定的类型,其值是由值初始化产生的值(8.5)T型物体;没有对void()进行初始化案例[…]

措辞也与C++11之前非常相似。

这在constexpr中是可以的,即使7.1.5节第3段说:

constexpr函数的定义应满足以下条件约束:

包括这个项目符号:

其返回类型应为文字类型;

并且void不是C++11中的文字,根据第3.9节第10段,但如果我们查看第6段落,它给出了一个适合这种情况的例外,它说:

如果constexpr函数的实例化模板专用化类模板的模板或成员函数将无法满足constexpr函数或constexpr构造函数的要求,该专门化不是constexpr函数或constexpr构造函数。[注意:如果函数是成员函数,它将仍然是const,如下所述--结束语]如果没有专门化该模板将生成一个constexpr函数或constexpr构造函数,程序格式错误;无需诊断

正如Casey在C++14标准草案中所指出的那样,无效文字,这是3.9类型部分10段落说:

如果类型是:,则该类型为文字类型

包括:

--空洞;或

请参阅@Shafik Yaghmour的回答以获取完整信息。

以下段落禁止非模板(7.1.5(3)):

constexpr函数的定义应满足以下约束:

  • […]

  • 其返回类型应为文字类型或对文字类型的引用

更详细地说,文字类型在3.9(10)中定义为标量类型或数组或结构中文字类型对象的组合。void不是3.9(9)的标量类型。

您的函数返回void()的值,而不是从void函数本身返回。您返回的是NULL的值。你正在做的事情相当于:

void f() { return void(); }

这将返回一个void值,这是唯一的void值。不能从void函数返回任何其他内容,因为它的类型不同。