名稱空間
變體
操作

std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable

來自 cppreference.com
< cpp‎ | 型別
 
 
超程式設計庫
型別特性
型別類別
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
型別屬性
(C++11)
(C++11)
(C++14)
(C++11)(C++26 中已棄用)
(C++11)(直到 C++20*)
(C++11)(C++20 中已棄用)
(C++11)
型別特性常量
元函式
(C++17)
支援的操作
關係與屬性查詢
型別修改
(C++11)(C++11)(C++11)
型別轉換
(C++11)(C++23 中已棄用)
(C++11)(C++23 中已棄用)
(C++11)
(C++11)(直到 C++20*)(C++17)

(C++11)
(C++17)
編譯時有理數算術
編譯時整數序列
 
定義於標頭檔案 <type_traits>
template< class T, class U >
struct is_assignable;
(1) (C++11 起)
template< class T, class U >
struct is_trivially_assignable;
(2) (C++11 起)
template< class T, class U >
struct is_nothrow_assignable;
(3) (C++11 起)
1) 如果表示式 std::declval<T>() = std::declval<U>() 在未求值上下文中形式良好,則提供成員常量 value 等於 true。否則,valuefalse訪問檢查 執行時,如同來自與任一型別都無關的上下文。
2)(1),但賦值表示式的求值將不呼叫任何非平凡操作。對於此檢查的目的,對 std::declval 的呼叫被認為是平凡的,不被認為是 std::declvalodr-使用
3)(1),但賦值表示式的求值將不呼叫任何非 noexcept 操作。

如果 TU 不是完整型別、(可能帶 cv 限定的)void,或未知邊界的陣列,則行為未定義。

如果上述模板的例項化直接或間接依賴於不完整型別,並且該例項化在該型別假設完成時可能產生不同的結果,則行為未定義。

如果程式為此頁上描述的任何模板新增特化,則行為未定義。

目錄

[編輯] 輔助變數模板

template< class T, class U >
constexpr bool is_assignable_v = is_assignable<T, U>::value;
(C++17 起)
template< class T, class U >
constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
(C++17 起)
template< class T, class U >
constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value;
(C++17 起)

繼承自 std::integral_constant

成員常量

value
[靜態]
true 如果 T 可以從 U 賦值,否則為 false
(public static 成員常量)

成員函式

operator bool
將物件轉換為 bool,返回 value
(公開成員函式)
operator()
(C++14)
返回 value
(公開成員函式)

成員型別

型別 定義
value_type bool
型別 std::integral_constant<bool, value>

[編輯] 注意

此特性不檢查賦值表示式的直接上下文之外的任何內容:如果使用 TU 將觸發模板特化、隱式定義特殊成員函式的生成等,並且這些有錯誤,則實際賦值可能無法編譯,即使 std::is_assignable<T,U>::value 編譯並評估為 true

[編輯] 示例

#include <iostream>
#include <string>
#include <type_traits>
 
struct Ex1 { int n; };
 
int main()
{
    std::cout << std::boolalpha
              << "int is assignable from int? "
              << std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
              << "int& is assignable from int? "
              << std::is_assignable<int&, int>::value << '\n' // int a; a = 1; works
              << "int is assignable from double? "
              << std::is_assignable<int, double>::value << '\n'
              << "int& is nothrow assignable from double? "
              << std::is_nothrow_assignable<int&, double>::value << '\n'
              << "string is assignable from double? "
              << std::is_assignable<std::string, double>::value << '\n'
              << "Ex1& is trivially assignable from const Ex1&? "
              << std::is_trivially_assignable<Ex1&, const Ex1&>::value << '\n';
}

輸出

int is assignable from int? false
int& is assignable from int? true
int is assignable from double? false
int& is nothrow assignable from double? true
string is assignable from double? true
Ex1& is trivially assignable from const Ex1&? true

[編輯] 參閱

檢查型別是否具有複製賦值運算子
(類模板) [編輯]
檢查型別是否有移動賦值運算子
(類模板) [編輯]
指定型別可從另一型別賦值
(概念) [編輯]