(更新:這個問題從價值具有用於const Foo
和Foo
不同的含義對象通過包裝類,基於entirely on strong opinions from people here此舉的實現源於之前,我一直在身邊掠過const Foo*
和Foo*
當包裝來了,我換了Wrapper<Foo>
和const Wrapper<Foo>
現在很清楚,機械替代沒有意義,我將需要更復雜的東西,如Wrapper<Foo>
和Wrapper<const Foo>
...雖然我沒有知道如何正確地寫出這些,誤解的道歉,但我會保留在這裏,因爲我實際上認爲它比許多問題更能揭示出來)有沒有像std :: value_wrapper與std :: reference_wrapper並行的東西?
在尋找到this question,它似乎歸結爲平行的想法,你不能做到這一點:
const Foo defaultFoo (6502);
const Foo theFoo (getConstFoo()); // returns const Foo for privilege reasons
if (theFoo.getBar() < 2012) {
theFoo = defaultFoo; // Error.
}
// ...you want to do const-safe methods with theFoo...
就像引用一個常量的值不能再定位。執行以下操作將編譯,但不會是我(在這種情況下的)將被打算:
Foo defaultFoo (6502);
Foo& theFooRef (getFooRef());
if (theFooRef.getBar() < 2000) {
theFooRef = defaultFoo; // Not an error, but not a retarget.
}
// ...you want to do stuff with theFooRef...
看來(從我的理解)是reference_wrapper
可以解決此在基準情況下,像:
Foo defaultFoo (6502);
std::reference_wrapper<Foo> theFooRef (getFooRef());
if (theFooRef.get().getBar() < 2000) {
theFooRef = std::ref(defaultFoo);
}
// ...do stuff with theFooRef.get() or employ implicit cast...
我不知道是否有一個「value_wrapper
」在那裏它做類似的事情。對我來說,想要一個變量來保存一個項目的值是常量正確性的常量,這並不是因爲你不會改變它。 (例如,在預訂treewalk中跟蹤當前節點,儘管只有對該樹中的節點具有const訪問權限,其中將前一節點傳遞給函數是如何獲得新節點)
如果你想成爲笨重,你可以使用std::pair<const Foo, bool>
,只是忽略了bool
:
const Foo defaultFoo (6502);
std::pair<const Foo, bool> theFooBool (getConstFoo(), false);
if (theFooBool.first.getBar() < 2012) {
theFooBool = std::pair<const Foo, bool> (defaultFoo, false);
}
// ...do const-safe methods with theFooBool.first...
但有解決這個,除了實現自己的「value_wrapper
」版本的更好的辦法?
我不明白。通過分配'theFoo = defaultFoo',您可以更改'theFoo'_的值。因此,聲明它爲'const'是錯誤的。如果你需要能夠改變某些東西的值,不要聲明它是'const'。如果你真的想讓'theFoo'具有const限定的特性,並且在初始化'theFoo'時需要能夠選擇一個'Foo'或者另一個',那麼使用函數或lambda表達式來封裝選擇邏輯。 – 2012-07-12 23:48:50
我認爲你從根本上誤解了const的正確性_is _...另外,'getConstFoo'返回'Foo const'這一事實並不意味着'theFoo'本身必須是const;你正在執行一個邏輯副本,所以副本的源是否是const是不相關的。 – ildjarn 2012-07-12 23:49:42
致@JamesMcNellis和ildjarn:赦免,但你的迴應使我平行於某人說:「如果它是一個參考,你永遠不會重新分配它,這不是參考文獻的工作方式!閱讀一本書!但是,人們會來參觀,因爲他們發現了這種發明的動機場景。所以請與我一起處理這個場景,而不是假設我*「不理解const正確性」*(!): - /我設法使用lambdas來通過一些條件初始化邏輯......但是想想pre使用const值(本身是一個包裝器)的順序遍歷的情況。 – HostileFork 2012-07-12 23:55:29