代码之家  ›  专栏  ›  技术社区  ›  Mikhail

为什么“void*=0”和“void*=nullptr”会有区别?

  •  22
  • Mikhail  · 技术社区  · 6 年前

    我在和斯芬娜玩,发现我无法解释的行为。

    这个 compiles fine 以下内容:

    template<typename Integer,
             std::enable_if_t<std::is_integral<Integer>::value>* = nullptr>
    void foo(Integer) {}
    
    template<typename Floating,
             std::enable_if_t<std::is_floating_point<Floating>::value>* = nullptr>
    void foo(Floating) {}
    

    当这个( nullptr 0

    template<typename Integer,
             std::enable_if_t<std::is_integral<Integer>::value>* = 0>
    void foo(Integer) {}
    
    template<typename Floating,
             std::enable_if_t<std::is_floating_point<Floating>::value>* = 0>
    void foo(Floating) {}
    

    gives me a compile error

    prog.cpp: In function ‘int main()’: prog.cpp:13:10: error: no matching function for call to ‘foo(int)’
         foo(3);
              ^ prog.cpp:5:6: note: candidate: template<class Integer, std::enable_if_t<std::is_integral<_Tp>::value>* <anonymous> > void foo(Integer)  void foo(Integer) {}
          ^~~ prog.cpp:5:6: note:   template argument deduction/substitution failed: prog.cpp:4:64: error: could not convert template argument ‘0’ to ‘std::enable_if_t<true, void>* {aka void*}’
              std::enable_if_t<std::is_integral<Integer>::value>* = 0>
                                                                    ^ prog.cpp:9:6: note: candidate: template<class Floating, std::enable_if_t<std::is_floating_point<_Tp>::value>* <anonymous> > void foo(Floating)  void foo(Floating) {}
          ^~~ prog.cpp:9:6: note:   template argument deduction/substitution failed: prog.cpp:8:71: note: invalid template non-type parameter
              std::enable_if_t<std::is_floating_point<Floating>::value>* = 0>
                                                                           ^
    

    enable_if_t void void* = 0

    1 回复  |  直到 6 年前
        1
  •  32
  •   rustyx    6 年前

    0

    [temp.arg.nontype]/5.2

    std::nullptr_t

    (int*)0 nullptr