gpt4 book ai didi

c++ - 解析为 void(void) 的模板签名被 gcc 拒绝;这是有效的 C++ 吗?

转载 作者:可可西里 更新时间:2023-11-01 17:53:08 24 4
gpt4 key购买 nike

我认为这段代码是有效的 C++。 MSVC 同意,但 gcc 似乎不同意。 MSVC 和我错了吗? (或者我应该输入稍微不同的内容吗?)

#include <iostream>
#include <string>
#include <vector>

#include <functional>

template <typename T>
struct S
{
template <typename R>
void f(std::function<R(T)> fn)
{
auto p = &fn;
++p;
}
template <typename R>
void g(std::function<R(void)> fn)
{
auto p = &fn;
++p;
}
};

void f()
{
S<void> s;
auto p = &s;
++p;
}

int main()
{
f();
}

错误信息:

<source>: In instantiation of 'struct S<void>':

<source>:26:11: required from here

<source>:11:8: error: invalid parameter type 'void'

void f(std::function<R(T)> fn)

^

<source>:11:8: error: in declaration 'void S<T>::f(std::function<R(T)>)'

Compiler returned: 1

gcc 似乎没问题,如果我写字面量 void 作为参数类型(请参阅函数 g() 的参数)。但是如果我写 T 然后将 T 解析为 void 就不开心了(参见函数 f() 的参数).

最佳答案

不,您的示例不是有效的 C++。在Standard section [dcl.fct], paragraph 4 中找到了允许(void) 是一个没有参数的函数参数列表的规则。 :

A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list. Except for this special case, a parameter shall not have type cv void.

您问题的关键是“非依赖”一词,意思是不依赖于模板参数。需求可能是这样写的,因为在模板中编写函数声明 void func(T); 太奇怪了,期望它总是一个只接受一个参数的函数类型,然后在一种情况下发现它可能不是。

所以:

void f1(void);           // okay - classic style from C

void f2(void nothing); // error - the phony "void" parameter cannot be named

void f3(const void); // error - const void is a different type

using VoidType = void;
void f4(VoidType); // okay - using a non-dependent type alias

template <typename T>
void f5(T);
void (*fptr)(void) = f5<void>; // error - dependent parameter type cannot be void

关于c++ - 解析为 void(void) 的模板签名被 gcc 拒绝;这是有效的 C++ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52826468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com