2016-06-23 4 views
6

सी ++ 11 या सी ++ 14 में टाइप उपनाम को परिभाषित करना संभव है, मैं एक प्रकार के उपनाम को कॉन्स्टेक्स फ़ंक्शन में परिभाषित करने की कोशिश कर रहा हूं।क्या सीएसएक्सपी फंक्शन

मैंने कोशिश की:

#include <iostream> 
constexpr int foo(int i, int j) { return i + j; } 
using TConstExprFunction = constexpr int (*)(int i, int j); 

int main() { 
    TConstExprFunction f = foo; 
    constexpr int i = f(1, 2); 
    std::cout << i << std::endl; 
} 

लेकिन यह जी ++ और बजना ++ के साथ संकलित करने के लिए विफल रहता है।

जी ++: error: expected type-specifier before 'constexpr'

बजना ++: error: type name does not allow constexpr specifier to be specified

मैं इसे संकलन

#include <iostream> 
constexpr int foo(int i, int j) { return i + j; } 
using TConstExprFunction = int (*)(int i, int j); 

int main() { 
    constexpr TConstExprFunction f = foo; 
    constexpr int i = f(1, 2); 
    std::cout << i << std::endl; 
} 

बजना ++ से की त्रुटि संदेश बनाने के लिए नीचे के रूप में क्या करना है, यह मैं के लिए constexpr का उपयोग कर नहीं कर सकते हैं लगता है नाम लिखो।

तो, क्या किसी प्रकार के उपनाम को कॉन्स्टेक्स फ़ंक्शन में परिभाषित करना संभव है; यदि हां, तो कैसे?

+3

जैसे कि आप वहां 'स्थिर' का उपयोग नहीं कर सकते ... –

+0

"* तो, क्या एक प्रकार के उपनाम को कॉन्स्टेक्स फ़ंक्शन में परिभाषित करना संभव है *" आपके पास एक प्रकार का उपनाम हो सकता है। आप बस एक फ़ंक्शन को कॉल नहीं कर सकते हैं जैसे कि यह एक संकलन-समय निरंतर अभिव्यक्ति था। तो जिस प्रभाव को आप शायद चाहते हैं वह असंभव है। –

+0

@MarcGlisse यह समझ में आता है। – Mine

उत्तर

7

सी ++ मानक 7.1.5/p8 के अनुसार constexpr विनिर्देशक [dcl.constexpr] (जोर मेरा):

constexpr विनिर्देशक constexpr के प्रकार पर कोई प्रभाव नहीं है फ़ंक्शन या constexpr कन्स्ट्रक्टर।

7 घोषणाएं [dcl.dcl] से

इसके अलावा:

alias-declaration: 
using identifier attribute-specifier-seqopt = defining-type-id ; 

constexpr विनिर्देशक एक समारोह के प्रकार का हिस्सा नहीं है। परिणामस्वरूप, आप ऐसा नहीं कर सकते:

using TConstExprFunction = constexpr int (*)(int i, int j); 

के बाद से एक using TConstExprFunction = के बाद एक प्रकार की उम्मीद है।

1

आप किसी प्रकार के उपनाम को कॉन्स्टेक्स फ़ंक्शन में परिभाषित नहीं कर सकते हैं।

+0

क्या कोई विशिष्ट कारण है कि सी ++ मानक इसका समर्थन नहीं करता है? – Mine

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