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

C++ 区分函数模板中的按值传递和按引用传递,c++,templates,reference,C++,Templates,Reference,有没有一种方法可以让编译器在不使用例如明确指定它的情况下,区分传递的变量是否为引用?下面的示例显示“1”,而我预期的是“2”: template <typename Type> void fun(Type) { cout << 1 << '\n'; } template <typename Type> void fun(Type &) { cout << 2 << '\n'; } int main

有没有一种方法可以让编译器在不使用例如
明确指定它的情况下,区分传递的变量是否为引用?下面的示例显示“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);
}
模板
虚无乐趣(类型)
{
cout
模板>
虚无乐趣(类型)
{

STD::你使用的是什么编译器?看起来不太有效C++,我认为这些调用应该是模棱两可的。大多数编译器都同意:@演绎IdStukAK,我也这么认为,但是编译器为什么允许定义这些方法?(我使用Apple CLAN,它允许我定义这两种方法)@farzadshbfn这很可能是您的编译器中的一个bug。这引起了我的兴趣,Jasper,因此我尝试使用g++8.3.0构建程序,并得到了预期的错误。使用的编译器选项:
-std=c++17-O0-g3-pg-pedantic-Wall-Wextra-Wconversion-c-Wuninitialized
您使用了哪些选项?@jasperking,无论如何,您将无法像那样区分。呼叫站点上
fun(x)
fun(ref)
的参数类型都是相同的:
int&
。但是我不能用权威链接回答,将留给语言更丰富的人。
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;
}