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())调用它`错误:
  • 错误C2660:
    takenout
    :函数不接受1个参数

  • 编写模板化函数
    template void takeGeneric(T param){}
    并使用
    takeGeneric(void())
    错误调用它:
  • 错误C2893:未能专门化函数模板
    T

  • 声明
    void voidType
    错误:
  • 不允许使用不完整的类型

  • 声明
    autoautovoid=void()
    错误:
  • 无法推断
    自动
    类型

  • 声明
    void*voidPtr
    可以正常工作,但是
    remove\u指针\u t decltypeVoid
    错误:
  • 错误C2182:
    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
    的重要性。我建议你把它写进一个答案里,但是我