返回空白
Returning a void?
我不明白为什么这段代码编译时没有错误:
#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函数返回任何其他内容,因为它的类型不同。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- QML 函数始终返回空白
- 字符串:: substr()返回一个空白字符串
- 返回空白
- QT 5.4 QPrinterInfo::printerName返回空白
- OpenCV VideoCaptures 有时会返回空白帧
- Qt5.4 QOpenGLFramebufferObject toImage 返回空白图像
- 为什么从文件输入中读取 std::string 会返回空白
- WASAPI GetDisplayName 返回空白
- Getline只返回空白
- 我在我的程序中添加了一个void函数,它不接受任何参数,现在我的程序在运行时只返回一个空白终端
- ReadFile()返回一个空白数据
- QtCreator QMediaPlayer元数据返回空白QString
- 为什么这段代码在试图将.txt放入向量并对其进行cout时会返回空白控制台