मैं निम्नलिखित परीक्षण कार्यक्रम है:अस्थाई स्थिरांक सरणी rvalue संदर्भ के लिए बाध्य नहीं
#include <iostream>
#include <type_traits>
#include <utility>
template<typename Ty, std::size_t N>
void foo(Ty (&&)[N])
{
std::cout << "Ty (&&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty, std::size_t N>
void foo(Ty (&)[N])
{
std::cout << "Ty (&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty>
using id = Ty;
int main()
{
std::cout.setf(std::cout.boolalpha);
foo(id<int[]>{1, 2, 3, 4, 5});
foo(id<int const[]>{1, 2, 3, 4, 5}); // <-- HERE.
int xs[]{1, 2, 3, 4, 5};
foo(xs);
int const ys[]{1, 2, 3, 4, 5};
foo(ys);
foo(std::move(xs));
foo(std::move(ys));
}
मैं उम्मीद होती है कि लाइन एक तीर के साथ चिह्नित बस इसे ऊपर गैर स्थिरांक कॉल की तरह rvalue अधिभार कहेंगे लेकिन यह नहीं करता है
क्या यह सिर्फ जीसीसी में एक बग है या मानक में कुछ ऐसा है जो lvalue अधिभार का चयन करने का कारण बनता है?
दिलचस्प, क्लैंग यह सही हो जाता है और रावल ओवरलोड को कॉल करता है। – Xeo
अच्छा सवाल: मानक की मेरी बेवकूफ समझ आपके साथ सहमत है। [लाइव] (http://ideone.com/ErHuYO) यदि आप आउटपुट देखना चाहते हैं। – Yakk
यहां कुछ मजाकिया चल रहा है: http://ideone.com/ptTJ8i - मेरा 'const int' अस्थायी 'int &&' की तरह व्यवहार किया जा रहा है, न कि 'const int &&'। – Yakk