[c++] दृश्य सी ++: सूचक के रूप में एक सरणी को अग्रेषित करें


0 Answers

मेरा मानना ​​है कि std::decay<const char []>::type है जो आप http://en.cppreference.com/w/cpp/types/decay के लिए देख रहे हैं

Question

मैंने कुछ सी ++ 11 कोड काट दिया है जो दृश्य स्टूडियो 2015 पर संकलित करने में विफल रहा था, जिसके लिए मुझे लगता है कि संकलन करना चाहिए (और झगड़ा और जीसीसी के साथ करता है):

#include <utility>

void test(const char* x);

int main()
{
    const char x[] = "Hello world!";

    test(std::forward<const char*>(x));    
}

मैं समझता हूं कि forward करने के लिए कॉल आवश्यक नहीं है। यह कोड के एक बहुत जटिल बिट से कट जाता है जो कि किसी भी सरणियों को एक भिन्नतापूर्ण तर्क में संकेतक के नीचे घटाता है और सब कुछ को आगे बढ़ाता है मुझे यकीन है कि टेम्पलेट स्पेशलाइजेशन या एसएफआईएनएई के साथ इस पर काम करने के तरीके मिल सकते हैं, लेकिन मैं यह जानना चाहता हूं कि इससे पहले कि सड़क नीचे जाने से पहले यह मान्य C ++ है कंपाइलर विजुअल स्टूडियो 2015 है, और समस्या इस ऑनलाइन एमएसवीसी कंपाइलर पर बनाई जा सकती है। संकलन त्रुटि है:

main.cpp(13): error C2665: 'std::forward': none of the 2 overloads could convert all the argument types
c:\tools_root\cl\inc\type_traits(1238): note: could be '_Ty &&std::forward<const char*>(const char *&&) noexcept'
        with
        [
            _Ty=const char *
        ]
c:\tools_root\cl\inc\type_traits(1231): note: or       '_Ty &&std::forward<const char*>(const char *&) noexcept'
        with
        [
            _Ty=const char *
        ]
main.cpp(13): note: while trying to match the argument list '(const char [13])'

अद्यतन करें:

@ याक ने इस तरह एक और उदाहरण का सुझाव दिया है:

void test(const char*&& x);

int main()
{
    const char x[] = "Hello world!";

    test(x);    
}

जो अधिक जानकारीपूर्ण त्रुटि देता है:

main.cpp(7): error C2664: 'void test(const char *&&)': cannot convert argument 1 from 'const char [13]' to 'const char *&&'
main.cpp(7): note: You cannot bind an lvalue to an rvalue reference

दोबारा, यह जीसीसी और क्लैग पर संकलित है विज़ुअल सी ++ के लिए कंपाइलर फ्लैग थे /EHsc /nologo /W4 /c । @ क्रैज़ी एडी ने सुझाव दिया है कि यह अस्थायी लोगों को गैर कॉन्सेन्ट संदर्भ के रूप में पास करने के लिए एक वीसी ++ एक्सटेंशन के नीचे हो सकता है।






Related