Clangが現在実装しているC++1z機能
注意:この記事の内容はC++17の正式な規格では変わっている可能性が高い。
Clang - C++1z, C++14, C++11 and C++98 Status
C++1z、あるいはC++17と呼ばれているC++の次期メジャーアップ規格に提案中の新機能のうち、Clangがすでに実験的実装を行っているものがある。これは、コンパイラーオプションに-std=c++1zを指定することで使うことができる。実装されている機能は、いずれも、まだドラフトにすら入っていない、提案論文しかない機能である。
本記事の執筆現在、Clangの-std=c++1zで実験的実装がされている提案は以下の通り。
N3928: static_assert with no message
C++11で追加されたstatic_assertは、必ず文字列リテラルを指定しなければならない。
// エラー
static_assert( true ) ;
// OK
static_assert( true, "" ) ;
文字列リテラルを指定したくない場合でも、必ず文字列リテラルを書かなければならない。これは極めて面倒で冗長だ。
そこで、N3928提案では、文字列リテラルを取らないstatic_assertの文法を追加する。
// OK, N3928提案
static_assert( true ) ;
N3981: Disabling trigraph expansion by default
既存の巨大なコードベースを検索したところ、トライグラフは一切意図的に使われていないことが判明した。トライグラフが使われているのは、トライグラフによる置換を防ぐためのエスケープと、コンパイラーやCプリプロセッサー実装のテストコードの中だけであった。トライグラフには現実の需要がない上、コードを書く妨げになっている。N3981では、トライグラフを取り除く提案をしている。
以下のコードを考える。
#include <iostream>
int main( )
{
std::cout << "??=" << '\n' ;
}
このコードを実行した結果、現行規格ならば、"#"が出力され、N3981提案では、"??="が出力される。
N3994: Terse range-based for loops
rage-based for loop、for ( elem : range )を、for ( auto && elem : range )に置き換える軽いシンタックスシュガーの提案。
// N3994提案
int main()
{
char range[] = "hello" ;
// for ( auto && elem : range ) と同等
for ( elem : range )
{
// 処理
}
}
なぜauto &&なのかについては、色々と理由があるので、詳しくは論文を参照。
N4051: Allow typename in a template template parameter
テンプレートテンプレートパラメーターは、文法上、classキーワードしか使えなかった。
// 現行規格
template <
template < typename T >
class U // ここにtypenameキーワードは使えない
>
struct X { } ;
テンプレートテンプレートパラメーターに渡せる型がクラス型しかなかった昔はともかく、今は、エイリアステンプレートがある。そこで、typenameキーワードも許可する提案。
// N4051提案
template <
template < typename T >
typename U // classでもtypenameでもよい
>
struct X { } ;
以上、小粒な新機能の実装が多い。これらは実装がそれほど難しくもないし、おそらくは、ドラフト入りして制式採用される機能だと思うが、最初に警告したように、まだドラフト入りすらしていない機能であるので、注意されたい。
ドワンゴ広告
この記事はドワンゴ勤務中に書かれた。
今日、社内のくだらない雑談チャットで、ドワンゴに必要なのは社内猫であるという意見が出た。ネコアレルギーの社員との兼ね合いは難しいだろうが、猫のいる職場は、確かに生産性が下がるのですばらしい。あれ? なにか違う気がする。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0