[llvm-bugs] [Bug 33655] New: Work around CWG issue 1558 (guarantee SFINAE when using `void_t`)

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Jun 30 05:45:20 PDT 2017


            Bug ID: 33655
           Summary: Work around CWG issue 1558 (guarantee SFINAE when
                    using `void_t`)
           Product: libc++
           Version: unspecified
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: All Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: vittorio.romeo at outlook.com
                CC: llvm-bugs at lists.llvm.org, mclow.lists at gmail.com

In both libstdc++ and libc++ `void_t` is currently implemented as:

    template <class...> using void_t = void;

Due to a CWG issue (#1558), unused parameters in alias templates are not
guaranteed to ensure SFINAE and could be ignored:

This causes code like this to surprisingly fail to compile:

    struct One { using x = int; };
    struct Two { using y = int; };

    template <typename T, std::void_t<typename T::x>* = nullptr>
    void func() {}
    template <typename T, std::void_t<typename T::y>* = nullptr>
    void func() {}

    int main() { func<One>(); }

There's a workaround for this issue available on cppreference. I propose to use
it to implement `void_t` to guarantee SFINAE-friendliness:

    template<typename... Ts> struct make_void { typedef void type;};
    template<typename... Ts> using void_t = typename make_void<Ts...>::type;


Context/more information:

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170630/cb2512db/attachment.html>

More information about the llvm-bugs mailing list