桁区切り文字の難しい問題

C++14に、数値リテラルの桁区切り文字が入るという話を数日前に書きました。
その際、カンマやアンダースコアは区切り文字の候補から外された、という話をしたので、その詳細を書きます。


まずカンマです。カンマはC++98/03からこんな書き方ができたので、

int a[] = {123,456};

カンマを桁区切り文字にしてしまうと、123,456というスペースなしカンマ区切りで書かれた数値を、複数の値なのか単一の値なのか判別できなくなります。


次にアンダースコアです。これは、C++11で導入されたユーザー定義リテラルと競合します。
ユーザー定義リテラルは、任意のサフィックスを定義できる機能で、値の型付けに使用しますが、そのサフィックスに_456のような、「アンダースコアで始まり、その後に数値がくる」サフィックスを許可しています。

#include <cassert>

int operator"" _456(unsigned long long int x)
{ return x; }

int main()
{
    int x = 123_456;
    assert(x == 123);
}

そのため、アンダースコアを桁区切り文字として採用してしまうと、C++11との互換性がなくなります。
(C++14はC++11のバグフィックス + マイナーアップデートバージョンなので、この変更をバグ修正と言い切ってしまうのも一つの手ではある)


桁区切り文字を機能として持っている言語のほとんどはアンダースコアを採用しているため、文化的な互換性としてアンダースコアは有力な選択肢ではありますが、C++自身の互換性に悩まされているというのが現状のようです。