C++ 构造一个空洞类型?
我得到了一段使用C++ 构造一个空洞类型?,c++,void,C++,Void,我得到了一段使用void()作为参数的代码。代码没有编译。。。显然 我们可以实例化任何类型的void?我相信答案是否定的,除了一个void*。例如: 编写函数void askVoid(void param){}时出错: 参数可能没有void类型 编写函数void askNaught(){}并使用askNaught(void())调用它`错误: 错误C2660:takenout:函数不接受1个参数 编写模板化函数template void takeGeneric(T param){}并使用take
void()
作为参数的代码。代码没有编译。。。显然
我们可以实例化任何类型的void
?我相信答案是否定的,除了一个void*
。例如:
void askVoid(void param){}
时出错:void
类型
void askNaught(){}
并使用askNaught(void())调用它`错误:takenout
:函数不接受1个参数
template void takeGeneric(T param){}
并使用takeGeneric(void())
错误调用它:T
void voidType
错误:autoautovoid=void()
错误:自动
类型
void*voidPtr
可以正常工作,但是remove\u指针\u t decltypeVoid
错误:decltypeVoid
:非法使用类型void
就这样,对吗?在C++中没有代码> VoD()/<代码>的位置吗?这只是给我的错误代码,对吗?您可以将void()
作为函数参数:
void test(void()) { ... }
扩展至:
void test(void (*)())
它是一个函数指针,指向返回void且不带参数的方法
完整示例:
void abc() {}
void test(void()) { }
int main() {
test(abc);
}
您可以使用void()
作为可调用类型,例如std::function f代码>是一个有效的语句
此外,从:
由单个非依赖类型void的未命名参数组成的参数列表相当于空参数列表
这意味着这是有效的:
template<typename T>
struct F;
template<typename R, typename... A>
struct F<R(A...)> { };
int main () {
F<void(void)> s;
}
模板
结构F;
模板
结构F{};
int main(){
F-s;
}
在这里,您没有实例化任何类型为void
,而是使用它(让我说)作为可调用类型的参数列表
<> P>不确定如果回答了你的问题,我不清楚这个问题到底是什么。 < P> C++(我说C++,不是C)允许()函数用<代码> VoUT//Cord:RealType返回<代码> VoUT//Cuff>表达式,即:
void foo() { return void(); }
但是请注意,它并不是在构造一个临时的空
在C++中没有空隙()的位置吗?
作为表达式, VoIDE()/Cuff>在C++中是有效的。
根据标准,$5.2.3/2显式类型转换(函数表示法)[expr.type.conv]
:
表达式T()
,其中T
是一个简单的类型说明符或
非数组完整对象类型或
(可能是cv限定)void
type,创建指定
类型,其值是初始化(8.5)一个
类型为T
的对象;未对void()
案例进行初始化
发件人:
新的_类型()
如果new_type
是对象类型,则对象值初始化;
否则,不进行初始化。如果新类型为(可能
cv合格)void
,表达式为void
prvalue
表达式void()
是类型为void
的prvalue,可以在任何可以使用此类表达式的地方使用,这有助于提供一个列表:
- 作为表达式语句:
void()代码>
- 作为条件运算符的第二个或第三个操作数:
true?抛出1:void()
- 作为逗号运算符的操作数:
++it1,void(),++it2
- 作为
decltype
或noexcept
的操作数:使用my_void=decltype(void());静态断言(noexcept(void()),“WAT”)代码>
- 在函数的
return
语句中,返回(可能是cv限定)void
:const void f(){return void();}
- 作为显式转换为(可能是cv限定的)
void
:static\u cast(void())
类型为void
的表达式也可以用作typeid
的操作数,但在此上下文中,void()
尤其会被解析为类型,而不是表达式。否,如果使用test(void)
则表示一个不带参数的方法(这在C中是必需的)-或者我错了吗?你是对的,我意识到我的评论离题了,就把它删掉了,请随意删掉我们的评论resolved@sokkyoku我认为没有必要删除它,它也可以帮助其他人澄清大括号的重要性:)@JonathanMee:void(*)(
是一种函数指针类型void()
是一种函数类型。这两者是相关的,但是问题以“我得到了一段使用void()作为参数的代码”开始,所以我认为这仍然是相关的。您可以在返回void
的函数中返回void
函数调用:void a(){};void b(){返回a();}
。这是一种void类型的表达式。@rodrigo在这种情况下会执行a()
?这很奇怪,但我的编译器没有抱怨。类似于只调用a()
作为b()
的最后一行。是的,这与只调用函数然后返回相同。C++模板系统中的一个特殊规则是:简化代码的编写:<代码>模板T脚注(){Read Bar();}。或者你需要一个模板专门化来删除虚假的return
s当T=void
@rodrigo惊人的是,当你把return
放在上下文中时,我看到了用void
调用return
的重要性。我建议你把它写进一个答案里,但是我