我在帖子底部有以下代码。问题是:虽然我希望在所有情况下都有 MyBar 的实例,但在某些情况下,已解析的类型是函数指针。
该代码使用 gcc 4.8.4 和 nvcc(7.0 和 7.5)编译并显示相同的行为。
标准中有什么可以解释这里发生了什么吗?MyBar myBar1()
似乎创建了一个函数指针,而不是我期望的默认构造实例。但即便如此,为什么案例 4 会创建一个函数指针?我想创建一个实例,将它传递给绑定到 const-ref 的 Bars ctor。它也应该能够绑定到 r-value-ref 而不是它的 r-value。还是我错过了什么?
#include <cstdio>
template<typename T_Type>
struct GetStaticAssertInfoType
{
typedef T_Type type;
};
#define PRINT_TYPE(TYPE) { typedef typename GetStaticAssertInfoType<TYPE>::SHOW_TYPE___ bla; }
template<class T_Foo>
void fooHost(T_Foo foo){
PRINT_TYPE(T_Foo);
foo.doIt();
}
template<class T1, class T2>
struct Bar{
T1 t1;
T2 t2;
Bar(const T1& t1 = T1(), const T2& t2 = T2()): t1(t1), t2(t2){}
void doIt(){ printf("1"); }
};
int main(int argc, char** argv){
typedef Bar<int, float> MyBar;
PRINT_TYPE(MyBar);
MyBar myBar1();
fooHost(myBar1); // Bar<int, float> (*)()
MyBar myBar2(int());
fooHost(myBar2); // Bar<int, float> (*)(int (*)()
MyBar myBar3(argc);
fooHost(myBar3);
MyBar myBar4(int(argc));
fooHost(myBar4); // Bar<int, float> (*)(int)
MyBar myBar5(1);
fooHost(myBar5); // Same as 3, no output (Bar<int, float>)
return 1;
}