c++ - 未定义的类模板未实例化以检查友元函数

标签 c++ templates argument-dependent-lookup

下面的程序可以编译(参见 godbolt ),但如果我们取消注释 Buffer 的定义,它就不会编译。 .

template <int size>
struct Buffer /*{ char buf[size]; }*/;

template <class T>
struct Wrapper { void operator+() {} };

Wrapper<Buffer<-5>> a;

void f() { +a; }

原因,未注释的版本无法编译:+a触发 ADL,并收集 operator+ 的所有候选人,必须检查所有关联类的 friend职能。 Buffer<-5>是一个关联类,所以它必须被实例化。实例化失败,因此编译错误。参见 this question .

我想知道 Buffer<-5>必须实例化,为什么我们没有编译错误,如果 Buffer没有定义?

最佳答案

可以(隐式地)仅从一个声明中实例化一个类模板;你得到一个不完整的类类型,就像 struct A; ( [temp.inst]/2 ) 一样。当然,使用不完整的关联类进行 ADL 并不是错误;有问题的类根本不会搜索友元声明。

关于c++ - 未定义的类模板未实例化以检查友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62351110/

相关文章:

c++ - 三元运算符

c++ - 在方法中迭代 vector

templates - 如何在 Angular 2中设置div的 "data-value"属性

c++ - 实例化点后 ADL 未找到最佳匹配。这是UB吗?

c++ - 四嵌套 unordered_map 怪物的替代方案?

C++ HDF5 使用数据集的维度作为 const int

c++ - ADL 找不到重载函数

c++ - std::(customization point) 是否调用最合适的重载?

c# - 从 C# 解决方案调试 C++ 解决方案

c++ - 为什么 C++ 顺序访问迭代器的函数签名不使用指针?