使用别名时未检测到名称冲突

时间:2016-10-04 07:32:52

标签: c++ alias shadowing using-declaration

这是this question的后续行动。请考虑以下示例:

#include <iostream>

namespace MyProject {
    class string {
        public: string() { std::cout << "Callin string constructor" << std::endl; }
    };
}

namespace Other {
    class string {};
}

namespace MyProject {
    using Other::string;
}

namespace MyProject {
    void useString() {
        const string s;
    }
}

int main() {
    MyProject::useString();
}

这里编译器正确地在行using Other::string处抛出一个错误,抱怨该命名空间中已存在string的声明,来自之前的class string定义。

现在考虑一下:

#include <iostream>

namespace MyProject {
    class string {
        public: string() { std::cout << "Callin string constructor" << std::endl; }
    };
}

namespace Other {
    class something {};
    using string = something;
}

namespace MyProject {
    using Other::string;
}

namespace MyProject {
    void useString() {
        const string s;
    }
}

int main() {
    MyProject::useString();
}

这里没有编译错误:我成功设法用新的string隐藏了我之前的using string = something声明。

  • 为什么第二种情况没有错误?是因为something不是真正的声明,因为它是别名,真正的声明是something名称,编译器只能发现冲突在实际声明之间,所以在这种情况下它会认为我真的声明stringcron,并且对此好吗?

  • 这不是很危险吗?我的意思是,如果这些事情发生在单独的头文件中而没有程序员意识到这一点,那么他/她最终可能会使用一个标识符,这可能与他/她的想法完全不同,并且没有编译器说什么......

0 个答案:

没有答案