c++ - सी++ प्रोग्राम्स



सी++ 17 टेम्प्लेट कटौती गाइड का उपयोग खाली पैरामीटर सेट के लिए नहीं किया गया? (1)

यह एक जीसीसी बग है (सिर्फ 81486 दर्ज किया गया है ) success() deducing success() , हम एक ओवरलोड सेट को संश्लेषित करते हैं जिसमें निम्न शामिल हैं:

// from the constructors
template <class T> success<T> foo(T&& ); // looks like a forwarding reference
                                         // but is really just an rvalue reference
template <class T> success<T> foo(T const& );

// from the deduction guides
template <class T> success<T> foo(T ); // this one is a bit redundant
success<void> foo();

और वापसी प्रकार का निर्धारण करें जैसे कि इसे foo() रूप में लागू किया जाता है, जो निश्चित रूप से आपको success<void> का एक प्रकार success<void> देना चाहिए यह एक बग नहीं है

निम्न कम उदाहरण पर विचार करें जो https://godbolt.org/g/Et56cm पर भी देखा जा सकता है:

#include <utility>

template <class T> struct success
{
  T value;
  constexpr success(T &&v)
      : value(std::move(v))
  {
  }
  constexpr success(const T &v)
      : value(v)
  {
  }
};
template <> struct success<void>
{
};
template <class T> success(T /*unused*/)->success<T>;
success()->success<void>;

int main(void)
{
    auto a = success{5};        // works
    auto b = success{};         // works
    auto c = success{"hello"};  // works
    auto d = success(5);        // works
    auto e = success();         // FAILS!
    auto f = success("hello");  // works
    static_assert(std::is_same<decltype(a), success<int>>::value, "");
    static_assert(std::is_same<decltype(b), success<void>>::value, "");
    static_assert(std::is_same<decltype(c), success<const char *>>::value, "");
    static_assert(std::is_same<decltype(d), success<int>>::value, "");
    static_assert(std::is_same<decltype(e), success<void>>::value, "");
    static_assert(std::is_same<decltype(f), success<const char *>>::value, "");
    return 0;
}

मेरे लिए आश्चर्य की बात यह है कि success() संकलन नहीं करती है, फिर भी success{} करता है मैंने टेम्पलेट कटौती गाइड success() -> success<void> , इसलिए मैंने सोचा होगा कि success() रूप में अच्छी तरह से काम करेगा

क्या यह अपेक्षित व्यवहार C ++ 17 मानक में है, या क्या मुझे कुछ याद आ रहा है?





template-deduction