読者です 読者をやめる 読者になる 読者になる

C++0x 一般化された属性(attribute)

C++

C++03 では、多くのコンパイラの独自拡張で属性を指定する構文があります。
たとえば、 GCC では __attribute__ 、 Visual C++ では __declspec のようなものがあります。


C++0x では、属性を指定するための構文が一般化されます。

属性を指定するためには角カッコ 2 つで囲み、その中に属性名を指定します。

[[ arrtibute-list ]]


以下は、標準で提供される属性です


【align】
align 属性は、アライメントの指定に使用します。

int value [[ align(4) ]];
int value [[ align(int) ]]; // int value [[ alignof(int) ]]; と同じ意味

align(型) もしくは align(式)


【noreturn】
noreturn 属性は、関数が返らないことを明示します。

void f [[ noreturn ]] ()
{
    throw "error"; // OK
}

// i <= 0で呼ばれたらill-formed
void g [[ noreturn ]] (int i)
{
    if (i > 0)
        throw "positive";
}

noreturn 属性が付加された関数で関数が返った場合、その振る舞いは未定義です。


【final】
final 属性は、仮想関数のオーバーライド禁止を明示するための属性です。
final 属性が付加された関数をオーバーライドした場合、ill-formedです。

struct B {
    virtual void f [[ final ]] ();
};

struct D : B {
    void f(); // ill-formed
};

final 属性がクラス定義に指定された場合、継承したメンバ関数を含む、すべての仮想関数に final 属性を指定することと等価になります。



N2761 Towards support for attributes in C++ (Revision 6)

C++0x言語拡張まとめ