c++ - vector::push_back 从 const Type* 到 type* 的转换

标签 c++ vector constants const-cast

vector::push_back 的签名是:

void push_back (const value_type& val);

这意味着它负责不破坏 val

我的职能是:

Result User::addFriend(const User* newFriend)
{
    // check that newFriend is valid and is not already a friend
    if (newFriend == NULL || isFriend(newFriend)) return FAILURE;
    friends_.push_back(newFriend);
    friendsNum_++;
    return SUCCESS;
}

当我编译 .c 文件时出现编译错误:

invalid conversion from 'const User*' to 
std::vector User*::value_type
  1. 如果 push_back promise 不更改 val,为什么我们会收到此错误?

  2. 克服错误的正确且简洁的方法是什么?也许是 const_cast

谢谢!

用户.h:

class User {
...
public:
    vector<User*> friends_;
...
}

最佳答案

您正在存储一个指针 vector :

std::vector<User*> friends_;

但是,这种方法存在一个问题。请注意,这些指针不是 const User*:任何有权访问 friends_ 的人都可以自由修改 User

这里的vector中的类型参数是User*,不是User,也就是说value_type ≡ User。因此,这条线

void push_back (const value_type& val);

应该这样解释:

void push_back (const User*& val);

请注意 the syntax is a bit misleading here ;一个更清晰的方式来看待它是这样的:

void push_back (User *const &val);

const 修改左侧的内容: 它防止指针被更改,但它不会阻止底层的 User 本身不会被改变。

因为 const 只影响指针而不影响 User,传入 const User* 会违反契约:

Result User::addFriend(const User* newFriend){
    …
    friends_.push_back(newFriend);
    …
}

你不能这样做。由于 addFriend promise 不会阻止 User 被更改,因此将其存储到 non-const User* 的 vector 中> 将允许任何有权访问 vector 的人随意修改 User

可能的解决方案:

  • addFriend 使用 User* 而不是 const User*。更好的是:除非你有充分的理由不这样做,否则请使用引用。
  • friends_ 更改为使用 const User* 而不是 User*。更好的是:直接存储 User 而不是作为指针。
  • 复制用户

关于c++ - vector::push_back 从 const Type* 到 type* 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725290/

相关文章:

c++ - Eclipse CDT 中的 POSIX IPC 链接器错误

c++ - 如何在C++中实现 "is also"(扩展方法,如E语言)?

c++ - 为什么 C++ 共享指针的行为不像迭代器的标准指针?

c++将文件行读取到vector <string>

c++ - std::map::erase 无限循环

c++ - 是否允许在 const 定义的对象上丢弃 const 只要它实际上没有被修改?

c++ - 使用 string erase() 和 string length() 从字符串中删除某些字符

c++ - boost::posix_time::time_duration::total_seconds 有什么问题?

string - 对于未更改的字符串,去掉 Julia 的 `WARNING: redifining constant` 吗?

c# - 参数可以是常量吗?