[英]volatile and const volatile std::tuple and std::get
看看C ++ 11標准。 我可以看到為volatile
和const volatile
元組提供了std::tuple_size
和std::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
沒有為volatile
或const 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_element
和tuple_size
支持它。
1通過在第17節中的C ++標准中搜索volatile
,可以很容易地檢查這一點。 人們會發現除了第29節中的原子之外,沒有任何函數(模板)因為volatile參數而被重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.