2015-08-17 13 views
13

पर विचार करें निम्नलिखित मामलेstatic_assert त्रुटि

typedef void (*foo)(); 
template<foo f> 
struct bar { 
    static_assert(f!=nullptr,"f == null!"); 
}; 

void baz() {} 
inline void bax() { } 

bar<baz> ok; 
bar<bax> bad; // error: non-constant condition for static assertion 

दोनों baz और bax टेम्पलेट तर्क के रूप में स्वीकार कर रहे हैं देता है। यह इंगित करता है कि दोनों को स्थिरांक के रूप में स्वीकार किया जाता है। हालांकि, static_assert पर वे अलग-अलग प्रतीत होते हैं (कम से कम जीसीसी 4.9 में) - bax अब स्थिर नहीं है।

मेरे धारणा है कि static_assert और टेम्पलेट constantness हूबहू का मूल्यांकन किया गया था। ईजी। या तो त्रुटि होना चाहिए

  • या
  • static_assert गैर निरंतर हालत त्रुटि उठाना नहीं करना चाहिए 'bax कोई मान्य टेम्पलेट तर्क नहीं है'।

Am मैं गलत?

+1

जब तक 'foo' कहीं घोषित किया जाता है, मैं इस सब पर संकलन नहीं होगा ... –

+0

तय की उम्मीद, typedef शून्य (* foo) को खो दिया(); जोड़ा – hutorny

+1

वीसी ++ 14.0 दोनों स्वीकार करता है। – Fireho

उत्तर

1

जब एक समारोह inlined है, कार्य करने के लिए सूचक मौजूद नहीं है। तो हम इसे nullptr के साथ तुलना नहीं कर सकते हैं।

एक समारोह के अंत में inlined है या नहीं, संकलक पर निर्भर करता है। inline कीवर्ड इसकी गारंटी नहीं देता है।

+1

गलत है: यदि आप किसी फ़ंक्शन का पता लेते हैं (यहां तक ​​कि एक 'इनलाइन' डी) भी संकलक इसे देना चाहिए (और हमेशा उस फ़ंक्शन को इनलाइन नहीं करना चाहिए) –

संबंधित मुद्दे