चलो कहते हैं कि मेरे पास है चलो एक समारोह की तरह:आकार() std :: सरणी सूचक की constexpr संदर्भ में
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
स्पष्ट रूप से बफर के आकार संकलन समय पर मूल्यांकन किया जा सकता: डेटा 8 के एक constexpr
आकार की है तत्व, 8 * 2 = 16 बाइट्स।
हालांकि, जब -Wall
, -pedantic
और -std=c++11
साथ संकलन मैं कुख्यात त्रुटि मिलती है:
warning: variable length arrays are a C99 feature [-Wvla-extension]
जो मेरा मानना है कि बनाता है भावना: array::size()
constexpr
है, लेकिन यह अभी भी एक तरीका है, और हम ऊपर समारोह में अभी भी एक पॉइंटर को हटाना है, जो constexpr
नहीं है।
अगर मैं की तरह कुछ प्रयास करें:
int test(std::array<char, 8>& data) {
char buffer[data.size() * 2];
[...]
}
gcc
(कोशिश की संस्करण 5.2.0) खुश लगता है: कोई चेतावनी है।
लेकिन clang++
(3.5.1) के साथ मुझे अभी भी परिवर्तनीय लंबाई सरणी के बारे में शिकायत करने की चेतावनी मिलती है।
मेरे मामले में, मैं आसानी से test
के हस्ताक्षर को नहीं बदल सकता, इसे एक सूचक लेना है। तो ... कुछ सवाल:
सबसे अच्छा/सबसे मानक constexpr संदर्भ में एक
std::array
सूचक के आकार पाने के लिए तरीका क्या है?क्या पॉइंटर्स बनाम संदर्भों के साथ व्यवहार में अंतर अपेक्षित है? कौन सा कंपाइलर चेतावनी,
gcc
याclang
के बारे में सही है?
यह जानना क्यों 'size' एक स्थिर सदस्य कार्य नहीं है दिलचस्प होगा .. – dyp
मैं भी जोड़ना चाहिए वहाँ शायद किसी तरह टेम्प्लेट के माध्यम से आकार पाने के लिए है कि, कुछ की तरह: ' टेम्पलेट std :: size_t arraysize (स्थिरांक std :: सरणी और सरणी) {वापसी एन; } ' जो ऊपर उपयोग किया जा सकता है। फिर भी ... क्या यह सही तरीका है? लगता है कि contorted। –
rabexc
मैं इसे सूचक मामले में विफल होने पर देख सकता था लेकिन तकनीकी रूप से संदर्भ मामले नहीं, सूचक 'शून्य' हो सकता है; निश्चित रूप से, यह वहां कुछ भी उपयोगी नहीं कर सकता है, लेकिन इसका मतलब यह भी है कि 'आकार' ठीक से परिभाषित नहीं है। यदि 'आकार' वर्चुअल था, तो मैं इसे दोनों पॉइंटर्स और संदर्भों से शिकायत कर सकता था (क्योंकि यह 'std :: array 'से प्राप्त एक प्रकार हो सकता है जिसमें समान आकार' कार्यान्वयन 'नहीं है), लेकिन यह स्पष्ट रूप से नहीं है यहां मामला –
ShadowRanger