小编Yat*_*ima的帖子

C++ 11中的has_equal_operator实现

我试图has_equal_operator在C++ 11中实现,到目前为止提出了以下解决方案.它适用于简单的情况,如intstruct A{}但失败(返回误报)std::vector<A>.为什么失败以及如何解决这个问题?

#include <vector>
#include <iostream>

template<typename T>
constexpr auto has_equal_operator(int) -> decltype(std::declval<T>() == std::declval<T>(), bool()) { return true; }
template<typename T>
constexpr bool has_equal_operator(...) { return false; }

struct A {};

void test()
{
    std::cout << "has_equal_operator<int>: " << has_equal_operator<int>(0) << std::endl;
    std::cout << "has_equal_operator<A>:   " << has_equal_operator< A >(0) << std::endl;
    std::cout << "has_equal_operator<std::vector<A>>:   " << has_equal_operator< std::vector<A> >(0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

has_equal_operator<int>: 1
has_equal_operator<A>:   0
has_equal_operator<std::vector<A>>: 1
Run Code Online (Sandbox Code Playgroud)

c++ type-traits c++11

9
推荐指数
1
解决办法
176
查看次数

为什么在erase()调用后std :: vector迭代器无效?

C++参考清楚地声明调用std::vector::erase(it)迭代器将使指向擦除元素擦除元素之后所有迭代无效.http://en.cppreference.com/w/cpp/container/vector/erase

我确实理解为什么这些迭代器在erase调用后变得不可解除引用,但我很好奇为什么它们需要变得无效,实现细节需要什么呢?

例如,标准说std::vector必须使用连续存储的元素来实现,elements can be accessed not only through iterators, but also using offsets on regular pointers to elements因此这样的容器的迭代器可能实现为指针似乎是合乎逻辑的 - 但是指针如何变得无效?

c++ iterator stl vector c++11

4
推荐指数
2
解决办法
953
查看次数

标签 统计

c++ ×2

c++11 ×2

iterator ×1

stl ×1

type-traits ×1

vector ×1