STL容器赋值和const指针

Laj*_*agy 10 c++ gcc stl const

这编译:

int* p1;
const int* p2;
p2 = p1;
Run Code Online (Sandbox Code Playgroud)

这不是:

vector<int*> v1;
vector<const int*> v2;
v2 = v1;  // Error!
v2 = static_cast<vector<const int*> >(v1);  // Error!
Run Code Online (Sandbox Code Playgroud)

嵌套const指针的类型等价规则是什么?我认为转换是隐含的.此外,除非我真的需要,否则我宁愿不实现STL容器的逐点分配.

Joh*_*itb 43

无法直接分配.正如其他人所解释的那样,等价不是由指针类型建立的,而是由容器类型建立的.在这种情况下,vector不希望接受具有不同但兼容的元素类型的另一个向量.

没问题,因为你可以使用assign成员函数:

v2.assign(v1.begin(), v1.end());
Run Code Online (Sandbox Code Playgroud)

  • 我在某处看到了这个例子:苹果是一种水果,但一袋苹果不是一袋水果.它会违反Liskov Substitutability原则:你可以将橙子放入一袋水果中,但是你不能将橙子放入一袋苹果中.如果Bag(或者,在你的情况下,vector <T>)是不可变的,你就不会遇到这个问题. (10认同)
  • 为什么?我会理解犹豫是否将vector <char>隐式转换为vector <int>,但int*转换为const int*?我认为const在这方面受到特殊待遇.知道为什么C++标准决定反对吗? (2认同)

Nik*_*sov 20

从转换int*const int*内置于语言,但这些载体具有从一个到另一个没有自动转换.


小智 7

问题不是指针,而是两个向量的类型.在您的示例中,模板化类型(如v1和v2的类型)之间没有标准转换.

在以下代码中可能更容易看到:

#include <vector>
using namespace std;

int main() {
    vector <char> cv;
    vector <int> iv;
    cv = iv;    // error
}
Run Code Online (Sandbox Code Playgroud)