【问题标题】:I Can Define a Templatized Function Within a Lambda in Visual Studio我可以在 Visual Studio 的 Lambda 中定义模板化函数
【发布时间】:2016-05-09 14:02:14
【问题描述】:

this answer 中,我指出我可以在 lambda 中定义的结构中定义模板化方法。当我尝试这样做时,gcc 会出现编译器错误。

Minimal, Complete, Verifiable Example 的结尾,我在这里写了一个更简单的例子:

[]{struct{
    template <typename T> foo() { cout << "default\n"; }
    template <> foo<char> foo() { cout << "specialized\n"; } } result;
    return result; }

Live Example

此代码在 Visual Studio 中运行良好,可以在 http://webcompiler.cloudapp.net/ 进行测试,但链接的 gcc 代码:

本地类中成员模板的声明无效

【问题讨论】:

  • 这很有趣,我编辑了链接的问题,因为我相信 Visual Studio 不应该允许编译这段代码。而且绝对不是跨平台的标准符合代码。

标签: c++ visual-studio templates gcc lambda


【解决方案1】:

来自[temp.mem]

非闭包类型的本地类不应有成员模板。

我不知道 Visual Studio 在做什么。

【讨论】:

  • 嗯...我不太了解我的术语,无法知道“非闭包类型的本地类”是什么...您能帮我定义一些定义吗?
  • @JonathanMee 闭包类型是 lambda 表达式的类型。本地类是在函数中声明的类。
  • @JonathanMee 非封闭适用于类类型而不是类本地的函数。闭包类型例外是允许泛型 lambdas(它是本地的并且有一个成员模板 operator())。
  • @JonathanMee 是的,本地闭包类型可以有模板。如果他们不能,你就不能在函数中写[](auto foo, auto bar) { do stuff };
  • @JonathanMee 是的。只有闭包(lambda)可以在本地范围内定义并具有模板成员函数。任何其他类类型都不能。我认为这是因为闭包类型实际上是在全局空间中被淘汰的,它只是在本地范围内创建的未命名类的一个实例。
猜你喜欢
  • 2012-04-26
  • 2020-07-19
  • 2011-04-04
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2020-01-08
  • 2022-06-12
相关资源
最近更新 更多