Lần đầu tiên tôi đã cố gắng để viết một loạt trụ sở vòng lặp for để lặp qua unique_ptrs tôi đã viết:Làm thế nào để viết một unique_ptr có con trỏ và dữ liệu là const
std::vector<std::unique_ptr<Foo>> vec;
// Initialize vec
for (auto v : vec) // error
{}
sau đó tôi nhận ra điều này đang cố gắng để tạo ra một bản sao của mỗi phần tử không có ý nghĩa với unique_ptr. Vì vậy, sau đó tôi đã viết nó như là một tài liệu tham khảo:
for (auto& v : vec)
{}
Thêm một const ở phía trước nó giúp tôi thay đổi con trỏ.
for (const auto& v : vec)
{
v = nullptr; // error (good!)
}
Tôi làm cách nào để viết dữ liệu được trỏ đến không thể thay đổi? Ví dụ, mã sau không nên biên dịch.
for (??? v : vec)
{
v->func();
}
class Foo
{
public:
void func();
private:
bool mBar;
}
Foo::func()
{
mbar = true; // Should cause error
}
Bạn có luôn luôn cần pointee là 'const' (và do đó có thể thay đổi định nghĩa' vec') hay bạn chỉ cần nó là 'const' * cho vòng lặp * này? –
Một ứng dụng khác có thể là viết chức năng thanh tra, vì vậy tốt nhất là chỉ cho vòng lặp. Tuy nhiên, từ những câu trả lời thì điều này nghe không có vẻ. – user870130
xem tại đây: http://stackoverflow.com/questions/15518894/forcing-use-of-cbegin-cend-in-range-based-for – user1095108