c++ - 将模板与作用域在函数内的匿名类一起使用

标签 c++ templates anonymous-class

假设我有以下片段:

template <class T> void f(T arg) { arg(); }

void g()
{
   struct { void operator()(void) { } } foo;

   f(foo);
}

Visual C++ 接受这一点。但是,当我尝试 GCC 时,我得到:

$ g++ --version # just in case this matters
g++ (Debian 4.4.5-8) 4.4.5
...
$ g++ foo.cc
foo.cc: In function 'void g()':
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)'

foo 的范围是全局的并且它的类型有一个名字时,这是可行的。但是当类型是匿名的 g() 中声明时它不会。

为什么 GCC 拒绝这个?它是有效的 C++ 吗?

最佳答案

14.3.1 第 2 段:

局部类型、没有链接的类型、未命名类型或类型 从任何这些类型的化合物不得用作 模板类型参数的模板参数。

换句话说,无效。尽管在我看来这很方便,但这也许就是 VC 允许它的原因。

关于c++ - 将模板与作用域在函数内的匿名类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4659157/

相关文章:

c++ - for 循环初始化语句中的未命名结构声明

c++ - 在析构函数中删除 (this) 指针

c++ - 如何在 boost::gil 中使用 alpha channel 调整 png 图像的大小

c++ - 找到隐藏的无限循环

C++ 在 int main() 之上声明模板 <Class T>

c++ - 如何用命名的等价物替换未命名的结构、 union 、类?

c# - 匿名类、临时数据和匿名类的集合

c++ - 将用于串行通信的消息存储为 C++ 可行解决方案中的成员变量?

c++ - 无法从模板类调用通用 std::function 成员

c++ - 将可变参数函数模板参数传递给另一个函数