当函数体被实例化时,依赖函数调用重载解析应该通过ADL在关联的命名空间中找到最佳匹配,否则行为是未定义的,[临时候选人]§1 https://timsong-cpp.github.io/cppwp/n4861/temp.dep.candidate#1.sentence-3
如果调用格式不正确,或者在考虑关联命名空间内的查找时会找到更好的匹配项在这些命名空间中引入的具有外部链接的所有函数声明在所有翻译单元中,不仅仅考虑在模板定义和模板实例化上下文中找到的那些声明,那么程序具有未定义的行为。
例如:
struct A {
friend void f(A a){};
};
struct B : A {};
template <class T>
void g (T a) {
f(a);
}
void h(B b){
g(b);//undefined behavior (UB)
}
//TU2.cpp
//...
void f(B){}
我对哪些功能可能是其中之一有两个疑问在这些命名空间中引入的具有外部链接的所有函数声明
问题1
内联友元函数是否被认为是在封闭的命名空间中引入?
Exemple:
struct A {
friend void f(A a){};
};
struct B : A {};
template <class T>
void g (T a) {
f(a);
}
void h(B b){
g(b);//undefined behavior ??
}
//TU2.cpp
//....
struct C {
operator B();
friend void f(B){}
};
问题2
函数模板特化也会触发这种未定义的行为吗? (潜在实例化或实例化函数模板专业化)
Exemple:
struct A {
friend void f(A a){};
};
struct B : A {};
template <class T>
void g (T a) {
f(a);
}
void h(B b){
g(b);//undefined behavior ??
}
//TU2.cpp
//...
template <class T> void f(T){}
// optionaly also with:
// template void f(B);
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)