簡體   English   中英

volatile和const volatile std :: tuple和std :: get

[英]volatile and const volatile std::tuple and std::get

看看C ++ 11標准。 我可以看到為volatileconst volatile元組提供了std::tuple_sizestd::tuple_element

template <size_t I, class T> class tuple_element<I, volatile T>;
template <size_t I, class T> class tuple_element<I, const volatile T>;

template <class T> class tuple_size<volatile T>;
template <class T> class tuple_size<const volatile T>;

但是std::get沒有為volatileconst volatile元組提供特化。

我在GCC.4.8.1上嘗試了以下代碼

volatile std::tuple<int, int> a(1, 1);
std::cout << "a<0>=" << std::get<0>(a) << "\n";

我得到錯誤: no matching function for call to 'get(volatile std::tuple<int, int>&)'

所以如果我理解我可以創建(const)volatile元組但我無法訪問它們的元素。

這是預期的行為還是疏忽?

非常感謝。

這不僅適用於std::get ,也適用於關系運算符swap 為什么swap不支持volatile元組呢? 因為沒有tuple 移動構造函數需要使用volatile元組。 賦值運算符也是如此 實際上,當完整地考慮標准庫時,幾乎沒有類或模板為易失性對象1提供重載。 也許在標准化和實施方面會有很多麻煩; 或者也許它被認為是無意義的揮發性類對象。 在任何一種情況下,易失性元組目前都是非常不可用的,並且就接口的當前狀態而言,為它們添加get重載將是不一致的。

使用volatile tuple作為一種類型 (而不是一個對象)本身並不成問題,並且可能很有用。 這一點,以及標准庫中幾乎所有其他類型特征也專門用於所有cv限定符的tuple_element ,導致tuple_elementtuple_size支持它。


1通過在第17節中的C ++標准中搜索volatile ,可以很容易地檢查這一點。 人們會發現除了第29節中的原子之外,沒有任何函數(模板)因為volatile參數而被重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM