C++ 为什么类型别名决定输出是L值还是R值?

C++ 为什么类型别名决定输出是L值还是R值?,c++,reference,c++14,lvalue,type-alias,C++,Reference,C++14,Lvalue,Type Alias,为了测试,我创建了一个包含两个静态函数的结构。传递l值引用时调用f的第一个实例。当传递r值时调用第二个实例: template <typename _Tp> struct T { static constexpr void f(_Tp&) { std::cout << "f(T&) is called!\n"; } static constexpr void f(_Tp&&) { std::cout << "

为了测试,我创建了一个包含两个静态函数的结构。传递
l值引用时调用
f
的第一个实例。当传递
r值时调用第二个实例:

template <typename _Tp>
struct T {
    static constexpr void f(_Tp&) { std::cout <<  "f(T&)  is called!\n"; }
    static constexpr void f(_Tp&&) { std::cout << "f(T&&) is called!\n"; }
};
请注意,
operator()
返回通过构造函数给定的值

请随意询问我是否需要详细说明

编辑:
strong\u types
是一个名称空间。它存在于别名
create\u strong\u type
的其他内容中:

namespace strong_type {
    template <typename T, typename tag>
    using create_strong_type = Strong_Type<T, tag>;

    ...
}

...

template <typename T, typename tag>
struct Strong_Type {
    constexpr explicit Strong_Type(const T& value) : _value(value) {}
    constexpr explicit Strong_Type(T&& value) : _value(std::move(value)) {}

    constexpr T& operator()() noexcept { return _value; }

private:
    T _value;
};
名称空间强\u类型{
模板
使用create\u strong\u type=strong\u type;
...
}
...
模板
结构强_型{
constexpr显式强类型(const T&value):_值(value){}
constexpr显式强类型(T&&value):_值(std::move(value)){
constexpr T&运算符()()noexcept{return_value;}
私人:
T_值;
};

差异不是由于使用别名(
使用
),而是由于作为第一个模板参数传递给
创建强类型
的类型。在一种情况下,它是一个
int
,而在另一种情况下,它是一个
double


Try
T::f(KG(4.2)()
您将看到参数作为左值引用传递(因为返回类型为
Strong\u type::operator()
,即
T&
)。

什么是
Strong\u type
?当然,但它是第三方库吗?哦,很抱歉我的误解
strong_types
是我自己创建的名称空间。也不相关:以下划线开头,后跟大写字母的标识符是保留的,不允许使用它们。请修复编辑中的拼写错误,标识符不匹配,例如,
strong\u类型
vs
strong\u类型
strong\u类型
以及可能的
strong\u类型
应该是命名空间的一部分,并且在
创建strong\u类型
之前?。它并没有按照现在的方式编译代码,即使在代码中大量移动。
namespace strong_type {
    template <typename T, typename tag>
    using create_strong_type = Strong_Type<T, tag>;

    ...
}

...

template <typename T, typename tag>
struct Strong_Type {
    constexpr explicit Strong_Type(const T& value) : _value(value) {}
    constexpr explicit Strong_Type(T&& value) : _value(std::move(value)) {}

    constexpr T& operator()() noexcept { return _value; }

private:
    T _value;
};