0

我在帖子底部有以下代码。问题是:虽然我希望在所有情况下都有 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;
}
4

0 回答 0