GCC将`set`成员函数与`std::set`混淆

bfrts1fy  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(111)

下面的C++代码给出了GCC的错误(例如:13.1,参见godbolt.org),其中编译器似乎将set成员函数模板与std::set混淆:

#include <set>
using namespace std;
template <typename T> struct C {
    template <int S> void set(T const &) { }
};
template <typename T> struct D : C<T> {
    void f(T const & v) { this->template set<0>(v); }
};

字符串
它显然与using namespace std;行有关,但我不明白编译器如何在全局或std命名空间中查找set,当它被this->显式限定时。有人能给我点启发吗?

sgtfey8w

sgtfey8w1#

有一个关于here的GCC bug报告。
根据评论,有一个关于该行为的相关C++标准缺陷报告,但我找不到。
关于上下文:
当有一个类成员访问表达式,如X->Y(假设没有operator->重载)时,首先在类类型X的上下文中查找Y
但是如果没有成功,那么Y的查找也会在表达式的作用域中完成。这将例如。如果Yset,并且在作用域中有using namespace std;,则查找std::settemplate不会影响查找)。因为基类C<T>是依赖的,所以在模板定义上下文中的第一个查找阶段,不会找到它的成员set
此查找规则允许您编写例如。this->set<int>::size(),如果当前类派生自set<int>
现在的问题是,这应该如何与具有依赖基的当前类交互,这可能导致在示例化上下文中查找set以找到其成员。
我还没有查到目前和以前的标准是怎么说的。

相关问题