使用decltype定义静态成员(Intellisense不同意)
Using decltype to define static members (Intellisense disagrees)
我提出了使用decltype
在.cpp文件中定义静态成员的想法,然后使用以下宏:
#define DEFINE_SYMBOL(x) decltype(x) x
例如,通过这种方式,如果类Foo
声明static int bar
,我可以在foo.cpp中执行以下操作:
DEFINE_SYMBOL(Foo::bar) = 1337;
这看起来有点"粗糙",但它的优点是对原始符号类型的变化具有弹性。例如,如果bar在foo.hpp中变为unsigned,我就不需要更改foo.cpp。当成员的类型复杂时,它也更容易读取。
然而,如果静态成员是私有的,那么在Visual Studio 2015中,Intellisense会抱怨使用decltype(称其不可访问)。尽管程序编制得很好,但抱怨还是有道理的。现在,我的问题是,Intellisense是错的,还是不建议使用decltype(以及为什么)?
Intellisense不正确,gcc和clang都编译了类似的程序,我们可以看到C++标准草案11
[class.access]说:
第11条中的所有访问控制都会影响从特定实体的声明中访问类成员名称的能力,包括在被声明实体名称之前的声明部分,如果实体是一个类,该类成员的定义出现在该类的成员规范之外。[注意:此访问也适用于对构造函数、转换函数和析构函数的隐式引用。--尾注][示例:
class A { typedef int I; // private member I f(); friend I g(I); static I x; template<int> struct Q; template<int> friend struct R; protected: struct B { }; }; A::I A::f() { return 0; } A::I g(A::I p = A::x); A::I g(A::I p) { return 0; } A::I A::x = 0; template<A::I> struct A::Q { }; template<A::I> struct R { }; struct D: A::B, A { };
在这里,A::I的所有用法都是正规的,因为A::f、A::x和A::Q是类A和g的成员,并且R是类A的朋友。这意味着,例如,第一次使用A:时的访问检查:I必须是推迟到确定使用A::I作为类A的成员的返回类型。类似地,使用A::B作为基说明符是正确的格式,因为D是从A派生的,所以检查基说明符必须推迟,直到看到整个基说明符列表为止--结束示例]
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 函数向量_指针有不同的原型,我可以构建一个吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 访问者访问变体并返回不同类型时出错
- #为""定义宏;静态";针对不同的上下文
- 不同翻译单元中不可重载的非内联函数定义
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过继承类使用来自不同命名空间的运算符
- 我想做一个彼此不同但重复出现的数字
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- c++类声明时,相同的例程,不同的成员变量类型
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- Python中的for循环与C++有何不同
- 为测试目标创建具有不同源文件夹的文件