【问题标题】:Using declaration for a class member shall be a member declaration (C++2003)使用类成员的声明应为成员声明 (C++2003)
【发布时间】:2012-06-22 23:34:03
【问题描述】:

第 7.3.3 段。的 C++2003 标准声明

使用类成员的声明应该是成员声明。

这意味着以下给出了语法错误:

struct S1
{
    static int var1;
};

using S1::var1;

虽然以下编译正常:

namespace N2
{
    int var2;
}

using N2::var2;

有人知道这背后的理由(如果有的话)吗?

更重要的是,该标准给出了结构的静态数据成员的明确示例,并告诉它应该导致语法错误。 MS C++ 给出了这个错误:

cpptest1.cxx(9) : error C2885: 'S1::var1': not a valid using-declaration at non-class scope

目前还不清楚为什么要禁止。

【问题讨论】:

  • 除了结构没有命名空间
  • 语法错误的信息是什么?
  • 然后呢?这与问题有什么关系?
  • @K-ballo 无论如何,结构是一个类(嗯,有点),一个类是类固醇上的命名空间(参见 Stroustrup 书中的逻辑)。

标签: c++


【解决方案1】:

它不起作用的原因仅仅是因为标准禁止它。特别注意示例中的s

作为一种解决方法,您可以说:

auto& var = S1::var;

使标准(以及所有编译器)变得更复杂,以处理具有方便解决方法的不寻常情况,但无法通过成本效益测试。

【讨论】:

  • 问题不在于它是否有效。这很清楚。请仔细阅读最初的帖子。问题是关于标准背后的原因。你在最后一句话中所说的没有理由。 C2885 的文本表示 Microsoft 发出此错误以符合标准。这允许预期在早期版本中没有此限制。这并不奇怪。取消这个限制让事情变得更简单。
  • @Kirill:要求一名编译器开发人员(微软)取消对他们在没有委员会批准的情况下所做的事情的支持,这比要求数百个其他编译器添加支持便宜得多。
  • 除了少数编译器之外,我不确定他们的数量是否超过 50,还有数百万开发人员。语言定义中的每一次简化都会减少学习和混淆的时间。乘以 C++ 程序员的数量。这是真正的好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2015-05-27
相关资源
最近更新 更多