我创建了一个包含两个静态函数的结构体,用于测试目的。当传递一个左值引用时,会调用第一个 f
实例。当传递一个右值时,会调用第二个实例。
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"; }
};
在我尝试使用强类型进行实验时,我发现当我试图隐式创建强类型时,第一个实例T::f(_Tp&)
被调用了。为什么会这样呢?(请参见以下内容)
using T_int = T<int>;
T_int::f(
typename strong_types::create_strong_type<int, struct tag>(5)()
); // calls f::(T&) (?)
using KG = typename strong_types::create_strong_type<double, struct KG_tag>;
T_int::f(KG(4.2)()); // calls f(T&&)
请注意,
operator()
会返回通过构造函数传入的值。如果需要进一步解释,请随时询问。
编辑:
strong_types
是一个命名空间。它包括别名create_strong_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;
};
strong_types
是什么?答:strong_types
是什么? - Piotr Skotnickistrong_type
与strong_types
和Strong_Type
,可能应该是命名空间的一部分,并且在create_strong_type
之前?即使慷慨地移动代码,它也无法编译。 - user10605163