C++ SFINAE和sizeof vs constexpr

C++ SFINAE和sizeof vs constexpr,c++,c++11,constexpr,sfinae,C++,C++11,Constexpr,Sfinae,有时人们会写一些类似以下()的东西: 我知道constepr是该语言的一个相对较新的补充,但是除了使用旧标准(C++11之前)之外,还有什么理由更喜欢第一个版本吗?这两个选项都可以。但是它们之间的区别是第一个不需要C++11,而第二个需要。如果您至少可以自由使用C++11,那么就没有必要使用它们中的任何一个,标准库中已经有了 因此,如果您在某个项目中看到这样的代码,那么要么该项目应该在没有C++11支持的情况下编译,要么它是一些遗留代码。否。这两种代码都是在编译时进行计算的。这两个例子都可以使用

有时人们会写一些类似以下()的东西:


我知道
constepr
是该语言的一个相对较新的补充,但是除了使用旧标准(C++11之前)之外,还有什么理由更喜欢第一个版本吗?

这两个选项都可以。但是它们之间的区别是第一个不需要C++11,而第二个需要。如果您至少可以自由使用C++11,那么就没有必要使用它们中的任何一个,标准库中已经有了


因此,如果您在某个项目中看到这样的代码,那么要么该项目应该在没有C++11支持的情况下编译,要么它是一些遗留代码。

否。这两种代码都是在编译时进行计算的。这两个例子都可以使用更现代的习语来提高可读性。我想到了模板变量的部分模板专门化。
template<typename T>
class is_class {
    typedef char yes[1];
    typedef char no [2];
    template<typename C> static yes& test(int C::*); // selected if C is a class type
    template<typename C> static no&  test(...);      // selected otherwise
  public:
    static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};
template<typename T>
class is_class {
    template<typename C> static constexpr bool test(int C::*) { return true; } // selected if C is a class type
    template<typename C> static constexpr bool test(...) { return false; }     // selected otherwise
public:
    static bool constexpr value = test<T>(0);
};