C++ 为啥 Traits 在对象上不可用,而是作为静态成员变量可用

Posted

技术标签:

【中文标题】C++ 为啥 Traits 在对象上不可用,而是作为静态成员变量可用【英文标题】:C++ Why Traits are not available on objects but rather are available as static member variablesC++ 为什么 Traits 在对象上不可用,而是作为静态成员变量可用 【发布时间】:2020-07-11 05:25:03 【问题描述】:

我对类 Traits 的理解是,它是一个封装了一组类型和函数的类,这些类型和函数是模板类和模板函数操作它们被实例化的类型的对象所必需的。

在下面的例子中,为什么我们不能使用 'gquiz::container_type' 声明,否则我们怎么知道 gquiz 的特征:

int main()

    queue <int> gquiz;
    const queue <int>::container_type dq;
    //why not gquiz::container_type ?????
    cout << typeid(dq).name() << endl;
    gquiz.push(10);
    gquiz.push(queue <int>::value_type(20));
    gquiz.push(30);

【问题讨论】:

decltype(gquiz)::container_type 将是一个解决方案。 【参考方案1】:

你可以使用

decltype(gquiz)::container_type

确实,当x 不是一种类型时,x::ydecltype(x)::y 等效,这似乎更简单,而且我也(我敢打赌其他很多人)也考虑过。但是它不在标准中,原因是......因为它不在标准中,所以不起作用。

并非 C++ 中的每个决定都有逻辑依据,可能是这个特定的决定有逻辑原因,但我想不出一个。

也许没有理由。

随着 C++ 发生。很多。

【讨论】:

确实引入了更多的歧义。 @chris: x::y when x is not a type is not legal code and even in templates基本上你必须告诉编译器关于泛型x的唯一事情是它是否是一个类型或一个值。在这种情况下,x::y 可能意味着其他东西,而 x 不是类型,因此认为它意味着 decltype(x)::y 可能会引入歧义? 我的意思是 identifier :: identifier 可能意味着的事情模棱两可,这当然已经不止一件事了。需要处理更多的解析(无论是来自计算机还是人类)案例。

以上是关于C++ 为啥 Traits 在对象上不可用,而是作为静态成员变量可用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AUNetSend 在 iOS 上不可用? (或任何替代建议)

为啥包在 NuGet 上不可用?

外键在对象上不可用

为啥在 vue 3 watch 上不调用对象突变?

为啥 getExternalFilesDirs() 在某些设备上不起作用?

为啥clock()在集群机器上不起作用