我得到了一段使用
void()
作为参数的代码。代码显然无法编译……?
我们可以实例化任何类型为
void
的东西吗?我相信答案是否定的,除了void*
。例如:
void askVoid(void param) {}
错误:参数可能没有
类型void
void askNaught() {}
并使用askNaught(void())`错误调用它:错误 C2660:
:函数不接受 1 个参数takeNaught
template <typename T> void takeGeneric(T param) {}
并调用它并出现takeGeneric(void())
错误:错误 C2893:无法专门化函数模板
void takeGeneric(T)
void voidType
错误:不允许填写不完整的类型
auto autoVoid = void()
错误:无法推断
类型auto
void* voidPtr
工作正常,但 remove_pointer_t<decltype(voidPtr)> decltypeVoid
错误:错误 C2182:
:非法使用类型decltypeVoid
void
就是这样,对吧? C++ 中没有
void()
的位置吗?这只是我得到的错误代码,对吗?
表达式
void()
是 void
类型的纯右值,可以在任何可以使用此类表达式的地方使用,其中 [basic.fundamental]/9 有助于提供一个列表:
void();
true ? throw 1 : void()
++it1, void(), ++it2
decltype
或noexcept
的操作数:using my_void = decltype(void()); static_assert(noexcept(void()), "WAT");
return
语句中(可能是 cv 限定的)void
:const void f() { return void(); }
void
的操作数:static_cast<const void>(void())
void
类型的表达式也可以用作typeid
的操作数,但在这种情况下,void()
特别会被解析为类型,而不是表达式。
C++(我说的是 C++,而不是 C)允许具有 void
返回类型的(
§6.6.3 逗号 2)函数返回
void
表达式,即:
void foo() { return void(); }
但请注意,它不是构建临时
void
!
您可以将
void()
作为函数参数:
void test(void()) { ... }
扩展为:
void test(void (*)())
这是一个函数指针,指向一个返回 void 且不带参数的方法。
完整示例:
void abc() {}
void test(void()) { }
int main() {
test(abc);
}
您可以使用
void()
作为可调用类型,例如 std::function<void()> f;
是一个有效的语句。
此外,从8.3.5/4开始:
由非依赖类型 void 的单个未命名参数组成的参数列表相当于空参数列表。
这意味着这是有效的:
template<typename T>
struct F;
template<typename R, typename... A>
struct F<R(A...)> { };
int main () {
F<void(void)> s;
}
在这里,您没有实例化任何
void
类型的东西,但您正在使用它(让我说)作为可调用类型的参数列表。
不确定这是否回答了您的问题,我不清楚问题实际上是什么。
C++ 中没有 void() 的位置吗?
作为表达式,
void()
在 C++ 中有效。
从标准来看,
$5.2.3/2 Explicit type conversion (functional notation) [expr.type.conv]
:
表达式
,其中T()
是简单类型说明符或 非数组完整对象类型的类型名说明符或 (可能是 cv 限定的)T
类型,创建指定的纯右值 类型,其值是通过值初始化(8.5)产生的void
类型的对象;对于T
情况,未进行任何初始化。void()
来自 cppreference.com:
新类型 ( )
如果
是对象类型,则该对象是值初始化的; 否则,不进行初始化。如果new_type
是(可能 cv 限定)new_type
,表达式是void
纯右值。void