From 88ba6cfe220216f371f8756921059fac51a21262 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 23 Dec 2022 23:27:09 +0900 Subject: AsciiDoc to DocBook --- .../cpp-you-can-use-keywords-in-attributes.adoc | 106 --------------------- 1 file changed, 106 deletions(-) delete mode 100644 content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.adoc (limited to 'content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.adoc') diff --git a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.adoc b/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.adoc deleted file mode 100644 index afa0f3f..0000000 --- a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.adoc +++ /dev/null @@ -1,106 +0,0 @@ -= [C++] 属性構文の属性名にはキーワードが使える -:tags: cpp, cpp17 -:description: C++ の属性構文の属性名には、キーワードが使える。ネタ記事。 -:revision-1: 2021-10-02 Qiita から移植 - -この記事は Qiita から移植してきたものです。 元 URL: -https://qiita.com/nsfisis/items/94090937bcf860cfa93b - -''''' - -タイトル落ち。まずはこのコードを見て欲しい。 - -[source,cpp] ----- -#include - -[[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]] -[[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]] -[[char32_t]] [[class]] [[compl]] [[const]] [[const_cast]] [[constexpr]] -[[continue]] [[decltype]] [[default]] [[delete]] [[do]] [[double]] -[[dynamic_cast]] [[else]] [[enum]] [[explicit]] [[export]] [[extern]] [[false]] -[[final]] [[float]] [[for]] [[friend]] [[goto]] [[if]] [[inline]] [[int]] -[[long]] [[mutable]] [[namespace]] [[new]] [[noexcept]] [[not]] [[not_eq]] -[[nullptr]] [[operator]] [[or]] [[or_eq]] [[override]] [[private]] -[[protected]] [[public]] [[register]] [[reinterpret_cast]] [[return]] [[short]] -[[signed]] [[sizeof]] [[static]] [[static_assert]] [[static_cast]] [[struct]] -[[switch]] [[template]] [[this]] [[thread_local]] [[throw]] [[true]] [[try]] -[[typedef]] [[typeid]] [[typename]] [[union]] [[unsigned]] -[[virtual]] [[void]] [[volatile]] [[wchar_t]] [[while]] [[xor]] [[xor_eq]] -// [[using]] -int main() { - std::cout << "Hello, World!" << std::endl; -} ----- - -____ -コンパイラのバージョン $ clang++ –version Apple clang version 11.0.0 -(clang-1100.0.33.8) Target: x86_64-apple-darwin19.6.0 Thread model: -posix InstalledDir: -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - -コンパイルコマンド (C++17指定) $ clang++ –std=c++17 hoge.cpp -____ - -この記事から得られるものはこれ以上ないので以下は蛇足になる。 - -別件で cppreference.com の -https://en.cppreference.com/w/cpp/language/identifiers[identifier -のページ] を読んでいた時、次の文が目に止まった。 - -____ -* the identifiers that are keywords cannot be used for other purposes; -** The only place they can be used as non-keywords is in an -attribute-token. (e.g. [[private]] is a valid attribute) (since C++11) -____ - -キーワードでも属性として指定する場合は非キーワードとして使えるらしい。 -実際にやってみる。 - -同サイトの https://en.cppreference.com/w/cpp/keyword[keywords のページ] -から一覧を拝借し、上のコードが出来上がった (C++17 -においてキーワードでないものなど、一部省いている)。 大量の警告 (unknown -attribute `〇〇' ignored) -がコンパイラから出力されるが、コンパイルできる。 - -上のコードでは `[[using]]` をコメントアウトしているが、これは `using` -キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。 - -[source,cpp] ----- -// using の例 -[[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文 ----- - -C++17 の仕様も見てみる (正確には標準化前のドラフト)。 - -引用元: https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4 - -____ -If a keyword or an alternative token that satisfies the syntactic -requirements of an identifier is contained in an attribute-token, it is -considered an identifier. -____ - -「`identifier` の構文上の要件を満たすキーワードまたは代替トークンが -`attribute-token` に含まれている場合、`identifier` -とみなされる」とある。どうやら間違いないようだ。 - -ところで、代替トークン (alternative token) とは `and` (`&`) や `bitor` -(`|`) などのことだが、`identifier` -の構文上の要件を満たさないような代替トークンなどあるのか? -疑問に思って調べたところ、代替トークンという語にはダイグラフも含まれるらしい -(参考: -https://timsong-cpp.github.io/cppwp/n4659/lex.digraph[同ドラフト]) - -* `<%` → `{` -* `%>` → `}` -* `<:` → `[` -* `:>` → `]` -* `%:` → `#` -* `%:%:` → `##` - -「`identifier` -の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。 - -調べた感想: 字句解析器か構文解析器が辛そう -- cgit v1.2.3-70-g09d2