2016-09-21 6 views
5

क्या किसी को पता है कि टिप्पणी की गई रेखा संकलन में विफल क्यों होती है लेकिन असम्बद्ध पंक्ति ठीक है?निर्माण पर नामित std :: स्ट्रिंग को संशोधित करना संभव है?

main.cpp: In function ‘int main()’: 
main.cpp:5: error: expected ‘,’ or ‘;’ before ‘.’ token 

कोई व्याख्या कर सकते हैं नियम बनाम नामित std::string वस्तुओं गुमनाम संशोधित करने का अधिकार है, जहां वे निर्माण कर रहे हैं के बारे में क्या कर रहे हैं:

#include <iostream> 

int main() 
{ 
    // std::string foo("hello").erase(2); // This doesn't compile... 
    std::string("hello").erase(2);  // ...but this does. 
} 

टिप्पणी की लाइन भी शामिल है इस त्रुटि का कारण बनता है?

+3

एक घोषणा एक अभिव्यक्ति नहीं है, यही कारण है कि। –

+0

वही कारण जो आप लिख नहीं सकते 'शून्य एफ (int i) (5); '। – immibis

+0

@KerrekSB 'std :: स्ट्रिंग foo (" हैलो ")' एक घोषणा नहीं है (यह एक * प्रकार-विनिर्देशक * और एक * घोषणाकर्ता * है)। घोषणा उन चीजों के बाद होगी; '''। –

उत्तर

8

यह एक मुद्दा है जिसे भाषा के लिए वाक्यविन्यास के साथ करना है। घोषणा के बीच एक अंतर है, जो कथन है, और एक अस्थायी निर्माण, जो अभिव्यक्ति है। दोनों को भाषा द्वारा काफी अलग तरीके से संभाला जाता है और विभिन्न नियमों के अधीन होते हैं।

एक घोषणा कथन है जिसमें आप एक चर, नाम, और कुछ अभिव्यक्ति का प्रकार देते हैं जो इसे प्रारंभ करता है। तो, उदाहरण के लिए, आप लिख सकते हैं

std::string foo("hello"); 

या

std::string foo = "hello"; 

हालांकि, अगर आप नहीं

std::string foo("hello").erase(2); 

बस क्योंकि भाषा का कहना है कि वाक्य रचना वहाँ अनुमति नहीं है लिख सकते हैं। मेरा मतलब है, I जो आप कह रहे हैं उसे प्राप्त करें, और मुझे लगता है कि ज्यादातर लोग शायद भी करेंगे, लेकिन भाषा कहती है कि आपको ऐसा करने की अनुमति नहीं है। हालांकि, आप लिख सकते हैं

std::string foo = std::string("hello").erase(2); 

क्योंकि घोषणा बयान आप initializers के रूप में मनमाना भाव प्रदान करने की अनुमति है।

दूसरी ओर, अभिव्यक्ति

std::string("hello").erase(2) 

पूरी तरह से अभिव्यक्ति के रूप में अच्छी तरह से बनाई है, क्योंकि भाव अस्थायी वस्तुओं बनाने या विभिन्न वस्तुओं पर सदस्य कार्यों को फोन करके बनाया जा सकता है।

तो सच में, वहाँ कोई कारण नहीं क्यों भाषा ताकि आप क्या कानूनी होगा कर रहे हैं, लेकिन यह सिर्फ कि जिस तरह से नहीं बनाया गया गया था डिजाइन किया गया है नहीं सकता है।

+0

यह भी विचार करें: 'std :: string foo (" हैलो ")। ढूंढें ('l'); 'कम से कम' const' विधियों के लिए, यह उनके लिए कॉल करने योग्य भी समझ में नहीं आता है। –

5

एक नाम स्थानीय, वैश्विक, या नामस्थान-स्कोप्ड चर बनाने वाला बयान परिभाषा कहा जाता है। एक परिभाषा एक अभिव्यक्ति नहीं है, और आप उम्मीद नहीं कर सकते कि अभिव्यक्ति में अनुमत सभी को परिभाषा में भी अनुमति दी गई है। एक परिभाषा उस वस्तु को शुरू करने के लिए सख्ती से सीमित है जो इसे परिभाषित करती है।

दूसरा कथन एक अभिव्यक्ति है, इसलिए, आप जिस वस्तु को चाहते हैं उस पर आप जो भी सदस्य कार्य कर सकते हैं उसे कॉल कर सकते हैं।

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