[cfe-users] Syntax for declaring numeric literal operator template as friend

Michael Price michael.b.price.dev at gmail.com
Fri Feb 14 09:13:38 PST 2014


The following snippet compiles just fine using GCC 4.8.1 over at ideone.com,
but fails (on an admittedly old revision: ) of clang.  What is the valid
syntax for this construct?

template <char... Chars>
class Obj;

template <char... Chars>
constexpr Obj<Chars...> operator "" _test();

template <char... Chars>
class Obj
{
friend Obj operator"" _test <Chars...>();

private:
    constexpr Obj() { }
};

template <char... Chars>
constexpr Obj<Chars...> operator "" _test()
{
    return Obj<Chars...>();
}

int main()
{
    constexpr auto x = 1234_test;
    return 0;
}

I'm compiling with *clang++ -std=c++11 literal.cpp*

The errors are (note the line numbers are funky because I commented out a
bunch of previous lines in the file to get this minimal reproduction):

literal.cpp:771:16: error: parameter declaration for literal operator
      'operator "" _test' is not valid
    friend Obj operator"" _test <Chars...>();
               ^
literal.cpp:780:12: error: calling a private constructor of class
      'Obj<'1', '2', '3', '4'>'
    return Obj<Chars...>();
           ^
literal.cpp:785:28: note: in instantiation of function template
      specialization 'operator "" _test<'1', '2', '3', '4'>' requested here
    constexpr auto x = 1234_test;
                           ^
literal.cpp:774:15: note: declared private here
    constexpr Obj() { }
              ^
literal.cpp:785:20: error: constexpr variable 'x' must be initialized by
      a constant expression
    constexpr auto x = 1234_test;
                   ^   ~~~~~~~~~
3 errors generated.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20140214/4b96c08a/attachment.html>


More information about the cfe-users mailing list