11.13 C++11 でサポートされている機能

ARM コンパイラでは、C++11 の言語機能の大規模サブセットをサポートしています。

完全にサポートされている C++11 機能

ARM コンパイラでは、C++11 言語標準で定義されている以下の言語機能を完全にサポートしています。
  • 参照または変数の宣言で、auto を型指定子として使用できます。
  • constexpr
  • トップレベルの関数宣言子で、末尾の戻り値型を使用できます。
  • 可変個引数テンプレート。
  • エイリアスとエイリアステンプレート宣言(using X = int など)。
  • 二重右山形括弧トークン >> のサポートは、テンプレート引数リスト終了と解釈されます。
  • static_assert
  • enum クラスによる、範囲指定された列挙体。
  • 無制限共用体。
  • 拡張された friend クラス構文拡張。
  • noexcept 演算子と指定子。
  • 非スタティックデータメンバイニシャライザ。
  • テンプレートの型引数にローカル型と名前なし型を使用できます。
  • extern キーワードを使用すると、明示的なテンプレートのインスタンス化が抑制されます。
  • クラス型および仮想関数でのキーワード final
  • 仮想関数でキーワード override を使用できます。
  • ムーブコンストラクタとムーブ代入演算子の特殊メンバ関数の生成。
  • 関数を =delete で削除できます。
  • 生および UTF-8 文字列リテラル。
  • char16_tchar32_t 文字型および uU 文字列リテラル。
  • C++11 標準が受け入れる C99 言語機能。
  • 型変換関数を explicit とマーキングできます。
  • インラインネームスペース。
  • テンプレート推測コンテキストにおける式のサポート。

部分的にサポートされた C++11 の機能(制約あり)

ARM コンパイラでは、以下の言語機能を部分的にサポートしています。これらの機能を使用できますが、制約が課されることがあります。
  • nullptr
    ARM コンパイラでは、キーワード nullptr がサポートされます。しかし、標準ライブラリヘッダファイルには、std::nullptr_t の定義は含められません。それは、以下を使用して手動で定義できます。
    namespace std
    {
    	typedef decltype(nullptr) nullptr_t;
    }
  • 右辺値参照。
    ARM コンパイラでは、右辺値参照と参照修飾メンバ関数をサポートします。しかし、ARM コンパイラに付属する標準ライブラリには、std::movestd::forward の実装はありません。
    std::movestd::forward はいずれも、テンプレート引数推論を介して推論されたターゲット型を持つ static_cast の一種です。実装例を以下に示します。
    namespace std
    {
    	template< class T > struct remove_reference      {typedef T type;};
    	template< class T > struct remove_reference<T&>  {typedef T type;};
    	template< class T > struct remove_reference<T&&> {typedef T type;};
    						
    	template<class T>
    	typename remove_reference<T>::type&&
    	move(T&& a) noexcept
    	{
    		typedef typename remove_reference<T>::type&& RvalRef;
    		return static_cast<RvalRef>(a);
    	}
    	template<class T>
    	T&&
    	forward(typename remove_reference<T>::type& a) noexcept
    	{
    		return static_cast<T&&>(a);
    	}
    }
    ARM コンパイラでは、「A Taxonomy of Expression Value Categories」で説明されている prvalue、xvalue、glvalue などの C++11 値カテゴリを実装していません。代わりに、左辺値右辺値のドラフト C++0x 定義を実装しています。そのためまれなことですが、関数から右辺値参照を返すときに、C++11 標準とは動作が一部異なることがあります。
  • イニシャライザリストと統一初期化。
    ARM コンパイラでは、イニシャライザリストと統一初期化をサポートしますが、標準ライブラリでは std::initializer_list の実装は提供されません。イニシャライザリストと統一初期化を、ユーザが用意する std::initializer_list の実装と併用することができます。
  • lambda 関数
    ARM コンパイラでは、lambda 関数をサポートします。ARM コンパイラに付属する標準ライブラリには、std::function の実装はありません。つまり、lambda 関数を使用できるのは、型推論が使用されるときのみです。
    ある関数内で、auto を使用して、生成された lambda 関数を格納できます。lambda 関数は、以下のように関数テンプレートのパラメータとして渡すこともできます。
    #include <iostream>		
    template<typename T> void call_lambda(T lambda)
    {
    	lambda();
    }
    void function()
    {
    	auto lambda = [] () { std::cout << “Hello World”; };
    	call_lambda(lambda);
    }
  • ループ用の範囲ベースの for
    ARM コンパイラでは、ループ用の範囲ベースの for をサポートします。しかし、イニシャライザを中括弧で囲んだ範囲ベースの for ループには、std::initializer_list の実装が必要です。サンプルを以下に示します。
    for(auto x : {1,2,3}) { std::cout << x << std::endl; }
  • decltype
    decltype 演算子はサポートされていますが、C++11 拡張 N3049 と N3276 は含まれていません。つまり、標準では許容されているあらゆる場所で decltype を使用できるとは限らないということです。まとめると、decltype の以下の用法は、サポートされていません。
    • 名前修飾子として(decltype(x)::count など)。
    • デストラクタ呼び出しで(p->~decltype(x)(); など)。
    • ベース指定子として(class X : decltype(Y) {}; など)。
    • decltype コンストラクトは、不完全な型を持つ関数の呼び出しにはなれません。
  • C++11 属性構文
    ARM コンパイラでは、[[noreturn]] 属性をサポートします。
    ARM コンパイラでは、[[carries_dependency]] 属性を無視します。
  • デリゲートコンストラクタ
    コンパイラにより、デリゲートコンストラクタがサポートされます。しかし、例外が有効の場合、最新の C++ ランタイムライブラリに対してリンクする必要があります。
  • 特殊メンバ関数の =default のサポート
    特殊メンバ関数に =default でデフォルト実装を明示的に付与できます。ARM コンパイラでは、ムーブコンストラクタとムーブ代入演算子の特殊メンバ関数については、これをサポートしていません。その他の特殊メンバ関数は、すべてサポートされます。以下に例を示します。
    struct X
    {
    	// コンストラクタ、デコンストラクタ、コピーコンストラクタ
    	// およびコピー代入演算子がサポートされる
    	X() = default;
    	~X() = default;
    	X(const X&) = default;
    	X& operator=(const X&) = default;
    	
    	// ムーブコンストラクタとムーブ代入演算子は、サポートされない
    	X(const X&&) = default;
    	X& operator=(const X&&) = default;
    };

未サポートな C++11 機能

ARM コンパイラでは、以下の言語機能はまったくサポートされません。
  • std::atomic 向けの C++11 メモリモデル保証。
  • alignof 演算子と alignas 指定子。
  • 継承コンストラクタ。
  • スレッドローカルストレージキーワード thread_local
  • ユーザ定義リテラル。
  • スマートポインタ。

    ARM® コンパイラ 5 で提供されている C++ ライブラリは C++11 をサポートしていません。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.