C99の複合リテラルはC++にはない

#2352977e55a648d4aa8f54b9d172ea75
2025.12.16
2025.12.16
  • C++を書いていたら、GitHub Copilotが関数の引数として

    &(int){1}

    という見慣れない構文を提案してきた

  • (int){1}はC99の複合リテラル(Compound literal)というやつらしい。複合リテラルはlvalueなので、&でアドレスを取れる

  • しかし複合リテラルはC++には存在していない

  • 例えば

    void f(int *x) {}
    
    int main() {
      f(&(int){42});
      return 0;
    }

    は、clang (AppleClang 16.0.0)では何も言われないがclang++でコンパイルすると、次のエラーになる:

    src/main.cc:4:5: error: cannot take the address of an rvalue of type 'int'
        4 |   f(&(int){42});
          |
  • GCCでは拡張としてC++中でも複合リテラルを使うことができるようだ