14

C ++では、クラス名を数字で始めることは可能ですか?例えば、

template <class T> class 2DArray {

public:
    // 1D ARRAY CLASS
    class 1DArray {
    public:
        1DArray() { Create(); }
        1DArray(iterator arr) : array1d_(arr) { }
        explicit 1DArray(size_type cols, const T& t = T()) { Create(cols, t); }
        1DArray(const 1DArray& arr) { Create(arr.begin(), arr.end()); }
        1DArray& operator=(const 2DArray&);
        ~1DArray() { Uncreate(); }

        T& operator[](size_type n) {
            return array1d_[n];
        }
        const T& operator[](size_type n) const {
            return array1d_[n];
        }
}
4

4 に答える 4

27

C++での識別子名の規則は次のとおりです。

  1. 数字で始めることはできません
  2. 文字、数字、アンダースコア、ユニバーサル文字名1、および実装定義文字で構成できます
  3. キーワードにすることはできません。

これをカバーするC++ドラフト標準のセクションは、次の文法を含む2.11 識別子です。

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

および2.12 Keywordsは、キーワードとして使用するために予約されているすべての識別子を説明しています。

最後に、次の名前も予約されています。

  1. 二重アンダースコアを含む名前、または任意のスコープで__アンダースコアの後に大文字(のような)が続く名前。_Apple
  2. (グローバル名前空間のように)グローバル名前空間でアンダースコアで始まる_apple名前は予約されています。

ドラフト標準でこれをカバーするセクションはです17.6.4.3.2これらが国際標準の理論的根拠—プログラミング言語—Cから予約されている理由の理論的根拠を見つけることができます。

[...]これにより、ライブラリが適切に機能するために必要な、多くの舞台裏の非外部マクロおよび関数を記述するための名前空間が提供されます[...]

C ++では、この例が示すように、これは名前マングリングにも当てはまり ます。


脚注

  • 1.許可されたユニバーサル文字

許可されているユニバーサル文字は次のAnnex E.1とおりです。

E.1許可される文字の範囲[charname.allowed]

00A8、00AA、00AD、

00AF、00B2-00B5、00B7-00BA、00BC-00BE、00C0-00D6、00D8-00F6、00F8-00FF

0100-167F、1681-180D、180F-1FFF 200B-200D、202A-202E、203F-2040、2054、

2060-206F 2070-218F、2460-24FF、2776-2793、2C00-2DFF、2E80-2FFF

3004-3007、3021-302F、3031-303F

3040-D7FF F900-FD3D、FD40-FDCF、

FDF0-FE44、FE47-FFFD

10000-1FFFD、20000-2FFFD、30000-3FFFD、40000-4FFFD、50000-5FFFD、60000-6FFFD、70000-7FFFD、80000-8FFFD、90000-9FFFD、A0000-AFFFD、B0000-BFFFD、C0000-CFFFD、D0000- DFFFD、E0000-EFFFD

于 2013-03-08T02:45:16.323 に答える
4

簡単な答えはノーです。たとえば、OneDArrayと呼んでみませんか?

于 2013-03-08T02:44:51.133 に答える
4

驚いたことに、この質問の重複した、またはより一般的なバージョンを見つけることができなかったので、ここに標準(C ++ 11)の内容に基づいた回答があります。

まず、§9/ 1により、クラス名は識別子になります(または、テンプレートの特殊化の場合はsimple-template-idですが、simple -template-id識別子で構成されます)。

§2.11は、有効な識別子が何であるかを定義します。最初に、いくつかの基本的な概念を紹介します。

数字は次のいずれかです0 1 2 3 4 5 6 7 8 9
。非数字は次のいずれかですabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ユニバーサル文字名はタイプのシーケンス\unnnnまたは\Unnnnnnnn(それぞれnが16進数)

次に、規格は識別子を定義します-数字以外

  • 数字以外のいずれか
  • またはユニバーサル文字名
  • または実装定義の特殊文字(‡)

最後に、識別子は再帰的に次のように定義されます。

識別子
  識別子-非数字
  識別子 識別子-非数字
  識別子 数字

要約:言い換えると、識別子は(数字ではない!)英数字で始まる必要があり、その後に英数字、アンダースコア、および同様の\unnnn文字参照で構成されるものを続けることができます。それ以外は実装固有です。


(‡)サポートされているものがあるかどうかはコンパイラによって異なり、通常、それらを使用すると、他のコンパイラまたはコンパイラバージョンへの移植性が失われます。

于 2013-03-08T04:01:30.107 に答える
1

C ++での名前は、「文字」で始まる必要があります。ここで、文字はすべて大文字と小文字の「AZ、az」です。「_」は「文字」としてもカウントされます。その後、文字と数字の任意の組み合わせを続けることができます。

于 2013-03-08T02:46:39.653 に答える