- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试使用 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/
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: What is the difference between is_convertible is_assign
我正在努力适应一些 tmp 概念。 这是检查 2 种类型是否可分配的一种解决方案:这是最重要的部分: template class __is_assignable_helper: public __s
刚刚来自is_assignable and std::unique_ptr . @Angew 告诉我,因为 std::unique_ptr和 std::unique_ptr是不同的类型,所以 stat
这是 std::is_assignable 的实现,我花了几个小时试图了解它如何静态地找出模板化对象的类型,但没能成功。 在标准中is_assignable指出分配的两边都转换为 std::add_r
is_convertible 和 is_assignable 有什么区别? 为什么, 在 vs2012 中 is_convertible is false is_assignable is true
Here是来自 gcc 的测试文件,live demo struct do_nothing { template void operator()(T*) {} }; int main
std::is_assignable::value == false在一致的实现中(例如 clang/libc++、gcc/libstdc++,但不是 VS2012)。 直觉上,这意味着像 int x
我在尝试使用 std::is_assignable 进行推断时遇到了一个小问题 我的代码: #include #include class Object{}; enum my_conv { s
更具体的原因 std::is_assignable_v 也给出了 false。) 请注意: struct Structure {}; std::is_assignable::value;会返回 tr
给定两个非常简单的类: class X { }; class Y : public X { }; 为什么会这样,使用 Clang 和 GCC targeting C++14 , std::is_ass
希望问题从问题中显而易见:)如果不是,请考虑以下代码: template class test { public: test(std::string &v) : val(v) {}
我想弄清楚如何在 is_assignable 的实现中解释 declval() = declval()。 declval 将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一: _Dest&&
正如预期的那样,以下代码 does not compile . #include #include int main() { using T = std::pair; const
以下表达式使用 is_assignable返回 true使用 gcc 4.7 和 boost 1.49 时: typedef boost::function F; std::is_assignable
在 VS2017 中切换到 LLVM 工具集以使用 Boost 1.68 构建代码时,我收到以下构建错误。使用 MSVC 编译器可以很好地构建代码。 1>C:\boost_1_68_0\boost/t
我是一名优秀的程序员,十分优秀!