यह कोड क्लैंग (6,7,8,9, ट्रंक) में संकलित नहीं है, लेकिन जीसीसी (7.1, 8.1, 9.1) में ठीक संकलित करता है:
template<class T> struct TypeHolder { using type = T; };
template<int i>
class Outer {
private:
template<class T>
static constexpr auto compute_type() {
if constexpr (i == 42) {
return TypeHolder<bool>{};
} else {
return TypeHolder<T>{};
}
}
public:
template<class T>
using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};
int main() {
Outer<42>::TheType<int> i;
}
क्लैंग मुझे बताता है:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... बेशक यह कौन सा है, लेकिन मैं उस सदस्य को उसी वर्ग के अंदर से एक्सेस करने की कोशिश कर रहा हूं । मैं यह नहीं देखता कि इसे वहां क्यों नहीं पहुंचाया जाना चाहिए। क्या मैंने एक क्लैंग बग को मारा (और मुझे फ़ाइल करना चाहिए)?
आप Godbolt के कंपाइलर एक्सप्लोरर में कोड के साथ चारों ओर खिलौना कर सकते हैं ।
मजेदार! हालांकि, एक्सेस चेक निश्चित रूप से "अनुमतियों" के साथ बनाया जाना चाहिए
—
लुकास बर्थ
Outer<42>
, न कि main
- सही? अब मेरे लिए एक बग की तरह और भी अधिक।
std::result_of
इसके बजाय काम का उपयोग करता है ?
एफडब्ल्यूआईडब्ल्यू, आईसीसी और एमएसवीसी में भी काम करता है।
—
क्रिसम्यू
friend int main();
क्लैंग को शिकायत करने से रोकता है।