std::is_assignable 和常量指针对象
std::is_assignable and const pointer object
我在尝试用std::is_assignable
推断事物时遇到了一个小问题
我的代码:
#include <string>
#include <type_traits>
class Object{};
enum my_conv {
string, const_object, object
};
template<typename T, typename V = void>
struct deducer;
template<typename T>
struct deducer<T, typename std::enable_if< std::is_constructible<std::string, T>::value >::type > {
static const my_conv value = my_conv::string;
}; // (1) test for string
template<typename T>
struct deducer<T, typename std::enable_if< std::is_assignable<Object*&, T>::value >::type > {
static const my_conv value = my_conv::object;
}; // (2) test for Object derived
template<typename T>
struct deducer<const T, typename std::enable_if< std::is_assignable<Object*&, T>::value >::type > {
static const my_conv value = my_conv::const_object;
}; // (3) should test for const Object derived
class Test : public Object {
public:
Test() = default;
};
int main() {
std::string str;
Test* t = new Test;
const Test* tconst = static_cast<const Test*>(t);
deducer<decltype(t)>::value;// deduce as (1)
deducer<decltype(str)>::value;//deduce as (2)
deducer<decltype(tconst)>::value;//fail to deduce as (3)... why?
}
而且我真的不明白为什么编译器无法实例化第三个推导器......
编辑:
在测试时,我看到这样写道:
struct deducer<const T*, typename std::enable_if< std::is_assignable<Object*&, T*>::value >::type >
让它工作,但我想我仍然需要一些解释......因为我还是不明白第一时间出了什么问题......
显然它不会匹配(1),因为const Test *
无法从std::string
构造。
它不会匹配 (2),因为指向常量的指针不可分配给非常量指针。
它不会匹配 (3),因为这适用于常量类型,而不是指向常量类型的指针。
请记住,如果T
是像Test*
这样的指针类型,那么const T
是一个常量指针Test * const
,而不是指向常量Test const *
的指针。
tconst
的类型是指向const Test
的非const
指针。因此,它与类模板专用化匹配,没有(2)
:
template<typename T>
struct deducer<T, // [...]
与 T = const Test*
,而不是 (3)
,它匹配T const
类型(如 Test* const
,它与 const Test*
不同)。
但是,它仍然无法编译,回退到不完整的主类模板,因为当尝试将const Test*
(推导T
)分配给Object*&
类型的指针(缺少const
限定符)时,可分配性测试不成功。
相关文章:
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- 为什么我收到"从常量指针到指针的转换无效?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么C++中没有常量引用,就像常量指针一样?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 将常量指针强制转换为非常量
- 带有常量指针的矢量构造函数示例
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 常量指针上的混乱
- 使用 static_cast 时指向常量指针的原因
- 如何在C++中定义常量指针数组?
- 测试此指针的常量指针性质
- 当常量指针用作函数的参数时
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 在不同类型之间转换常量指针
- 解构常量指针?
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?