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 は、相互に置き換えが可能であることになる。