2

GCC 4.7.2 には、数値に対してのみ実装されている variadic-char-templated リテラル演算子があるようです。

template<char... chars>
constexpr size_t operator "" _size() { return sizeof...(chars); }

int main()
{
    std::cout << 42_size;    // (1) works
    std::cout << "foo"_size; // (2) does not
}
  • このコードをサポートする GCC のバージョンはありますか?
  • (2)は標準の一部ですか?
4

1 に答える 1

3

C++11 標準宣言の 2.14.8.5

L がユーザー定義の文字列リテラルの場合、str を ud-suffix を除いたリテラルとし、len を str 内のコード単位の数 (つまり、終端の null 文字を除いた長さ) とします。リテラル L は、フォーム演算子 "" X (str, len) の呼び出しとして扱われます。

したがって、コードを次のように書き換えます。

#include <iostream>

// (1)
template<char... chars>
constexpr size_t operator "" _size() { return sizeof...(chars); }

// (2)
constexpr size_t operator "" _size( const char* str, size_t sz ) { return sz; }

int
main(void)
{
  std::cout << 42_size << std::endl;    // (1)
  std::cout << "foo"_size << std::endl; // (2)

  return 0;
}

(2) の正しい形式を明示的に指定するには

于 2013-01-30T10:10:24.510 に答える