在模板中复制常量会基于类型奇怪地失败
我写了一个模板来复制C ++ 11的指针参数的常量:
template<typename S, typename D>
struct copy_const {
typedef typename std::conditional<std::is_const<S>::value,
typename std::add_const<D>::type,
typename std::remove_const<D>::type>::type type;
};
要在这样的方法中使用:
template<typename T, typename U,
class=typename std::enable_if<std::is_convertible<T, char>::value>::type>
typename copy_const<T, U>::type pointer(T*, U);
我正在根据U的类型获得不同的行为:
static_assert(std::is_same<decltype(pointer((char *)0, 0)), int>::value,
"bad pointer 1");
static_assert(std::is_same<decltype(pointer((const char *)0, 0)), const int>::value,
"bad pointer 2");
static_assert(std::is_same<decltype(pointer((const char *)0, 0)), int>::value,
"bad pointer 3");
error: static_assert failed "bad pointer 2"
基本上,无论T的常量如何,我都会得到“int”返回值,尽管我证实了T被解析为const char。
现在,如果我将U更改为其他类,则会正确复制常量:
struct V{};
static_assert(std::is_same<decltype(pointer((char *)0, V())), V>::value,
"bad pointer 4");
static_assert(std::is_same<decltype(pointer((const char *)0, V())), const V>::value,
"bad pointer 5");
static_assert(std::is_same<decltype(pointer((const char *)0, V())), V>::value,
"bad pointer 6");
error: static_assert failed "bad pointer 6"
即使下面的断言复制const也成功了:
static_assert(std::is_same<decltype(0), int>::value, "bad type");
static_assert(std::is_same<std::add_const<int>::type, const int>::value,
"bad const 1");
static_assert(std::is_same<const int, copy_const<const int, int>::type>::value,
"bad const 2");
这是一个编译器错误,还是我忽略了一些东西?
标量类型的const限定符在函数的返回类型上被忽略。 例如:
static const int returns_const_int();
int main()
{
static_assert(
std::is_same<decltype(returns_const_int()), const int>::value,
"not const"
);
}
原因
warning: type qualifiers ignored on function return type
[-Wignored-qualifiers]
static const int returns_const_int();
static assertion failed: not const
所以在指定pointer()
返回一个const int
,它实际上是返回一个非const int。
然而,对于类类型来说不是这样。
链接地址: http://www.djcxy.com/p/57005.html上一篇: copying constness in templates fails strangely based on type