【问题标题】:Context of using declaration and ambiguous declaration使用声明和歧义声明的上下文
【发布时间】:2014-08-07 17:20:49
【问题描述】:

有一段引述。 3.4.3.2/3:

给定 X::m(其中 X 是用户声明的命名空间),或给定 ::m(其中 X 是全局命名空间),如果 S(X, m) 是空集,则程序 格式不正确。 否则,如果 S(X, m) 只有一个成员,或者如果 引用的上下文是一个使用声明 (7.3.3), S(X, m) 是 m 的必需声明集。

S(X,m) 的定义如下。 3.4.3.2/2:

对于命名空间 X 和名称 m,命名空间限定的查找集 S(X, m) 定义如下:令 S (X, m) 为所有声明的集合 X 中的 m 和 X 的内联命名空间集(7.3.1)。如果 S (X, m) 是 不为空,S(X, m) 为 S(X, m);否则,S(X, m) 是 S(Ni , m) 用于通过 X 中的 using 指令指定的所有命名空间 Ni 和 它的内联命名空间集。

现在考虑以下代码:

#include <iostream>

using namespace std;
namespace N
{
    int cout = 6;
}
using namespace N;

int main() {
    using ::cout;//error: reference to ‘cout’ is ambiguous
    return 0;
}

我不明白这个错误。上面的代码不违反规则:

如果 S(X, m) 只有一个成员,或者如果引用的上下文 是一个使用声明(7.3.3),S(X,m)是所需的集合 m 的声明。

你能解释一下这条规则的含义吗?

【问题讨论】:

  • 您忘记提及您预期要识别的using 子句中的哪个cout
  • 对于函数,一组所有具有多个值的声明(可能)没有冲突和歧义,对于类和对象实例,您想要哪个是不明确的。

标签: c++ namespaces language-lawyer


【解决方案1】:

Dmitry,我怀疑您误解了“如果引用的上下文是 using-declaration”的含义。 “在 using-declaration 的上下文中”并不意味着“在 using-declaration 中使用时”。相反,它的意思是“当引用是 using-declaration 的主题时”。假设你的代码修改如下:

int main() {
    using N::cout;
    std::cout << "value=" << cout << '\n';
}

注意std::cout &lt;&lt; "value=" &lt;&lt; cout &lt;&lt; '\n' 中不合格的cout 的使用。该非限定引用的上下文是 using-declaration using N::cout

了解标准含义的另一种方式是 using-declaration 优先于 using-directive

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2013-02-28
    • 2011-01-10
    相关资源
    最近更新 更多