3

可変個引数テンプレートによって解析されたユーザー定義のリテラルに桁区切り記号を追加することで、コードの古い例を変更したところです。

namespace lits {
  // helper for 1 arg
  template<char C> int bin();  // common
  template<>       int bin<'1'>() { return 1; } // spec.
  template<>       int bin<'0'>() { return 0; } // spec.
  // helper 2 or more args
  template<char C, char D, char... ES>
  int bin() {
    return bin<C>() << (sizeof...(ES)+1) | bin<D,ES...>() ;
  }
  // operator"" _bin
  template<char...CS> int operator"" _bin()
    { return bin<CS...>(); };
}
int main() {
  using namespace lits;
  int number = 1000'0000_bin; // <<< I added a ' here
}

g++6.2.0で をインスタンス化しようとしたとき、私は驚きましたbin<'\''>。それは私のテンプレートに'as aを渡そうとしました! 同じ苦情でclang++-3.9msvc++-19.00を試してみましたが、本当に懐疑的です。chartemplate<char...CS> int operator"" _bin()

それは正しい行動ではないかもしれないと感じています。私のリテラルが引用符で囲まれていれば理解できたでしょうが"1000'0000"_bin、このフォームはテンプレート演算子 "" には存在しませんよね?

'テンプレートのユーザーリテラル演算子にも桁区切り記号が必要ですか?

更新 1:問題がない場合':

あらゆる種類のもの、たとえば複素数の sep として digit-sep を使用できます。52.84+67.12iに対する「52.84'67.12_i' の動作は明確に定義されていますか?」

Udpdate 2:いくつかのコメントの反応として。以下がコンパイルされます。

#include <iostream>
#include <string>
using std::string;

namespace lits {
  // helper
  template<char C> string sx() { return string{}+C; }
  // helper 2 or more args
  template<char C, char D, char... ES>
  string sx() {
    return sx<C>() + sx<D,ES...>();
  }
  // operator"" _sx
  template<char...CS> string operator"" _sx()
  { return sx<CS...>(); };
}
int main() {
  using namespace lits;
  std::cout << 10000000_sx << '\n';
  std::cout << 10'000'000_sx << '\n';
  std::cout << 0x00af_sx << '\n';
  std::cout << 0x0'c'0'a'f_sx << '\n';
  std::cout << 007_sx << '\n';
  std::cout << 0b01_sx << '\n';
  // the following do not work:
  //std::cout << 0b0a8sh3s1_sx << '\n';
  //std::cout << "abcde"_sx << '\n';
}

出力は次のとおりです。

10000000
10'000'000
0x00af
0x0'c'0'a'f
007
0b01

これは、テンプレートがすべての文字を取得することを意味します: 接頭辞と桁区切り文字 - それらすべて。(g++-6.2.0)

@krzaqの答えが示唆するように、これはStdの計画であるように見えるので、それに頼ることができます。

4

2 に答える 2

0

ここで読んだ限り、演算子が生のリテラルである場合ではなく、リテラルを数値として取得する場合にのみセパレーターが許可されます。つまり、unsigned long longC 文字列または char を取得する生の型の 1 つである場合ではなく、演算子のパラメーターの型が である場合、コンパイラによって区切り記号が取り除かれます。

于 2016-11-13T16:47:55.013 に答える