c++ - std::is_assignable 和 const 指针对象

标签 c++ templates c++11 metaprogramming

我在尝试使用 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),因为指向 const 的指针不可分配给非常量指针。

它不会匹配 (3),因为它适用于常量类型,而不是指向常量类型的指针。

请记住,如果 T 是像 Test* 这样的指针类型,那么 const T 就是一个常量指针 Test * const ,不是指向常量的指针 Test const *

关于c++ - std::is_assignable 和 const 指针对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29894610/

相关文章:

c++ - 如何初始化STL容器中存在的类的数据?

c++ - 为 UDP 服务器响应重用 sock_fd 与新 sock_fd

C++ 概念看到我的类型的函数,但看不到 std::vector 的函数

c++ - 使用 std::dynamic_pointer_cast 向上转换 std::shared_ptr

c++ - union 中的字符串、段错误

c++ - 非常基本的 C++ 程序在用户输入后无特殊原因关闭?

c++ - 如何使这个模板代码工作?

c++ - 具有模板化参数的函数指针歧义

c++ - 从祖先的方法和构造函数调用后代的方法

关于数组的 C++ 问题