std :: has_trivial_assign
が
No member named 'has_trivial_assign' in namespace 'std'
と言われるので調べてみた。
参考:
以前のバージョンの C++ ドラフト標準の型の特徴の古い名前が削除されました。 これらは C++11 で変更されており、Visual Studio 2015 では C++11 値に更新されました。 古い名前と新しい名前を次の表に示します。
古い名前 新しい名前 has_default_constructor is_default_constructible has_copy_constructor is_copy_constructible has_move_constructor is_move_constructible has_nothrow_constructor is_nothrow_default_constructible has_nothrow_default_constructor is_nothrow_default_constructible has_nothrow_copy is_nothrow_copy_constructible has_nothrow_copy_constructor is_nothrow_copy_constructible has_nothrow_move_constructor is_nothrow_move_constructible has_nothrow_assign is_nothrow_copy_assignable has_nothrow_copy_assign is_nothrow_copy_assignable has_nothrow_move_assign is_nothrow_move_assignable has_trivial_constructor is_trivially_default_constructible has_trivial_default_constructor is_trivially_default_constructible has_trivial_copy is_trivially_copy_constructible has_trivial_move_constructor is_trivially_move_constructible has_trivial_assign is_trivially_copy_assignable has_trivial_move_assign is_trivially_move_assignable has_trivial_destructor is_trivially_destructible
まず Visual Studio に関する名称変更の記事が見つかった。
大体表のように名前変更がなされているようだが、has_trivial_assign
から
is_trivially_copy_assignable
は名称に大きな差異がある。
どうしてそうなった。
Summary of renamed traits
General form Nothrow form Trivial form Construction is_constructible is_nothrow_constructible hasis _default_construct ibleorhasis _nothrow_default_construct ibleorhasis _trivial ly _default_construct ibleorhasis _copy_construct ibleorhasis _nothrow_copy_construct ibleorhasis _trivial ly _copy_construct ibleorhasis _move_construct ibleorhasis _nothrow_move_construct ibleorhasis _trivial ly _move_construct ibleorDestruction hasis _trivial ly _destruct ibleorAssignment hasis _copy_assign ablehasis _nothrow_copy_assign ablehasis _trivial ly _copy_assign ablehasis _move_assign ablehasis _nothrow_move_assign ablehasis _trivial ly _move_assign able
N3142: Adjustments to constructor and assignment traits
has_*_constructor
とhas_*_assign
という traits は、あたかもコア言語的な響きがする。 しかし、ライブラリ作者としては、ある型Tがコンストラクターを持っているかどうかは、別にどうでもよい。 ライブラリ作者が知りたいこととは、ある型T
に対して、T()
とか、T(U)
などと書いてよいかどうかである。 したがって、has
という名前は相応しくない。すべての
has_*_constructor
とhas_*_assign
という名前の traits を、is_*_constructible
と、is_*_assignable
という名前に変える提案。
この提案が採用されて is_trivially_copy_assignable
などに名称変更されたのがわかる。
その前は has_trivial_copy_assign
だったらしい。ならば has_tirivial_assign
から
has_trivial_copy_assign
に、どこかで名称変更しているはず。そのポイントを探してみる。
2010-06-08 Paolo Carlini paolo.carlini@oracle.com
- include/std/type_traits (has_nothrow_assign): Rename to has_nothrow_copy_assign. (has_trivial_assign): Rename to has_trivial_copy_assign.
- testsuite/20_util/has_nothrow_copy_assign/value.cc: New.
- testsuite/20_util/has_nothrow_copy_assign/requirements/ typedefs.cc: Likewise.
- testsuite/20_util/has_nothrow_copy_assign/requirements/ explicit_instantiation.cc: Likewise.
- testsuite/20_util/has_trivial_copy_assign/value.cc: Likewise.
- testsuite/20_util/has_trivial_copy_assign/requirements/ typedefs.cc: Likewise.
- testsuite/20_util/has_trivial_copy_assign/requirements/ explicit_instantiation.cc: Likewise.
これも
(has_trivial_assign): Rename to has_trivial_copy_assign.
ここまでひとまず has_trivial_assign
は is_trivially_copy_assignable
に名称変更されているのがほぼ決定した。
Boost で未だに boost :: has_trivial_assign
なのは has_trivial_copy_assign
になる前から開発されている名残か。
ここまでの流れからすると、 boost :: has_trivial_assign
と std :: is_trivially_copy_assignable
は、相互に置き換えが可能であることになる。