【发布时间】:2015-06-25 08:47:38
【问题描述】:
cppreference.com 关于is_assignable<T,U> type-trait 的说法是:
如果表达式
std::declval<T>() = std::declval<U>()在未计算的上下文中格式正确,则提供等于true 的成员常量值。对于任何其他类型,值为 false。 T 和 U 类型必须是完整的对象类型、cv void 或未知边界的数组。访问检查就像来自与任一类型无关的上下文一样执行。
但是代码:
template< std::size_t ...indices, std::size_t ...counter >
auto
invert_indices(std::index_sequence< counter... >)
{
constexpr std::size_t size = sizeof...(counter);
constexpr std::size_t inverted[size]{indices...};
return std::index_sequence< inverted[size - 1 - counter]... >{};
}
template< std::size_t ...indices >
auto
invert_indices()
{
return invert_indices< indices... >(std::make_index_sequence< sizeof...(indices) >{});
}
template< std::size_t ...indices >
using make_inverted_indices_t = decltype(invert_indices< indices... >());
using L = make_inverted_indices_t< 10, 20, 30 >;
using R = std::index_sequence< 30, 20, 10 >;
static_assert(std::is_same< L, R >{});
static_assert(std::is_assignable< make_inverted_indices_t< 10, 20, 30 > &, R >{});
static_assert(!std::is_assignable< make_inverted_indices_t< 10, 20, 30 > &, int >{});
工作,尽管函数 invert_indices 不是 constexpr 并且结果类型为 auto。
对于未评估的上下文,在decltype 工作期间是否仍允许查看函数体?
【问题讨论】:
标签: c++ c++11 c++14 typetraits