2014-06-25

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

1 comment:

  1. 制式採用、さすが自衛隊www
    正式採用だと思いますが・・・

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.