寻找重载与范本化函式时,不同的C ++编译器行为

时间:2018-12-07 04:44:28

标签: c++ c++11 templates overloading

我一直在学习模板并尝试使用它进行一些编程。最近,我偶然发现了一个奇怪的行为,在此尝试总结一下。假设我们有以下头文件MyHeader.H

class Dit{...};
class B{...};
class A{
   ...
   B & operator[] (Dit & it){...};
   ...
 };

template <T> bar(T& t){

static_assert(!std::is_same(T,A)::value," in bar, T cannot be of type A");
...
};

和主要功能

include "MyHeader.H"
foo(B & b){...};
foo(int t){...};
int main() {
    A a;
    Dit it;
    foo(a[it]); // the compiler has no problem in selecting the right overloaded foo
    bar(a[it]); // the compiler tries to instantiated it with type A, and because of the static_assert, it fails.
    return 0;
}

bar(A a)类型为a[it]的情况下,为什么编译器会寻找B定义?我还没有尝试过,但是如果使用

会有所不同
bar<B>(a[it]);
代替?当然,如果我这样做

B & temp=a[it];
bar(temp); 

一切都可以编译。

0 个答案:

没有答案