静态成员初始化中模板参数名称的C ++ 11 MSVS与GCC可见性

新泽西差异

我只想问为什么MSVS2013抱怨此代码与GCC不同(至少为4.8.3):

template <typename T>
struct MyClass
{
    typedef std::function<T*()> FunctionType;
    static FunctionType funcObj;
};

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
    []{return new T();};

在msvs2013中,它抱怨如下:错误1错误C2061:语法错误:标识符'T'

要修复,我必须对此进行修改:

template <typename T>
struct MyClass
{
    typedef std::function<T*()> FunctionType;
    static FunctionType funcObj;

    static T* foo()
    {
        return new T();
    }
};

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
    MyClass<T>::foo;

注意:最后一行不需要'MyClass <T> ::'。我只想暗示T仍在操作(待分配)的右侧可用,并且当T在lambda内时,它不再可用。

哪一个符合当前标准?在这种情况下,有什么方法可以确保类型名称在lambda中仍然可用?

先感谢您!


编辑

该问题似乎在当前版本中已解决,因此第一个版本也可以在MSVS中使用。

用户1978011

MSVC不符合标准,因为该标准规定(第9.4.2节[class.static.data]):

静态数据成员的定义中的初始化程序表达式在其类的范围内

显然,template参数T在template类的范围内,因此其名称应在static成员的初始化程序中可用funcObjLambda表达式继承类型的封闭范围内的,所以这个版本符合标准:

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
[]{return new T();};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

警告:“可见性”属性被忽略-符号可见性-C ++ / gcc

来自分类Dev

OOP成员变量可见性

来自分类Dev

MVVMCross中ImageButton的可见性

来自分类Dev

MPI中变量的可见性

来自分类Dev

ListView中的可见性消失

来自分类Dev

python中的数组可见性

来自分类Dev

MVVM中StackPanel的可见性

来自分类Dev

MultiDataTrigger中的WPF可见性

来自分类Dev

弹出菜单中的可见性

来自分类Dev

Rust 中的模块可见性

来自分类Dev

c#变量的可见性

来自分类Dev

gcc中模板的非延迟静态成员初始化?

来自分类Dev

UI线程和初始化线程之间的成员变量可见性

来自分类Dev

WPF:初始可见性和模板加载

来自分类Dev

使用静态可见性枚举作为命令参数

来自分类Dev

Spark作业中的Scala成员字段可见性

来自分类Dev

Oracle中的可用性与可见性

来自分类Dev

嵌套类中的模板别名可见性

来自分类Dev

如何在TextInputLayout Android中更改setEndIconDrawable的可见性(可见,不可见或不可见)?

来自分类Dev

GCC:可见性内部以什么方式“在实际使用中几乎没有用”?

来自分类Dev

如何设置给定集群对特定成员的可见性

来自分类Dev

C ++中的私有继承可见性/访问

来自分类Dev

C ++中跨线程的变量可见性

来自分类Dev

删除 C++ 中的枚举可见性

来自分类Dev

受保护的静态方法可见性

来自分类Dev

C ++ 11模板类中模板类成员的初始化

来自分类Dev

C ++ 11初始化模板成员变量

来自分类Dev

名称空间中类的可见性

来自分类Dev

名称空间中类的可见性