区分函数模板中的值传递和引用传递

Jas*_*ing 5 c++ templates reference

有没有办法让编译器区分传递的变量是否是引用,而无需使用 eg 显式指定它<int &>?以下示例显示“1”,而我预期的是“2”:

template <typename Type>
void fun(Type)
{
    cout << 1 << '\n';
}

template <typename Type>
void fun(Type &)
{
    cout << 2 << '\n';
}

int main()
{
    int x = 0;
    int &ref = x;
    fun(ref);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试使用std::ref,但我没有让它工作。

Kor*_*elK 2

template <typename Type, typename = std::enable_if_t<!std::is_reference<Type>::value>>
void fun(Type)
{
    std::cout << 1 << '\n';
}

template <typename Type, typename = std::enable_if_t<std::is_reference<Type>::value>>
void fun(Type &)
{
    std::cout << 2 << '\n';
}

int main() {

    int x = 0;
    int &ref = x;
    fun<int&>(ref); // Call the one that you want, and don't leave the compiler decide which one you meant

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)