相关疑难解决方法(0)

如何检查const_reverse_iterator到reverse_iterator的赋值是无效的?

考虑以下:

using vector_type = std::vector<int>;
using const_iterator = typename vector_type::const_iterator;
using const_reverse_iterator = typename vector_type::const_reverse_iterator;
using iterator = typename vector_type::iterator;
using reverse_iterator = typename vector_type::reverse_iterator;

int main()
{
    static_assert(!std::is_assignable_v<iterator, const_iterator>); // passes
    static_assert(!std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // fails
    static_assert(std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // passes
}
Run Code Online (Sandbox Code Playgroud)

我可以检查分配iterator{} = const_iterator{}是无效的,但不能检查reverse_iterator{} = const_reverse_iterator{}具有此类型特征的分配.

此行为在gcc 9.0.0,clang 8.0.0MSVC 19.00.23506中是一致的

这很不幸,因为实际情况是reverse_iterator{} = const_reverse_iterator{}实际上并没有使用任何上述编译器进行编译.

如何可靠地检查此类作业是否无效?

类型特征的这种行为意味着表达式

std::declval<reverse_iterator>() = std::declval<const_reverse_iterator>() 
Run Code Online (Sandbox Code Playgroud)

根据[meta.unary.prop]很好地形成,这看起来与我自己在is_assignable类型特征上的尝试一致.

c++ c++17

10
推荐指数
2
解决办法
184
查看次数

标签 统计

c++ ×1

c++17 ×1