निम्नलिखित संकलन नहीं करता है :
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}
संकलक त्रुटि है: error: assignment of read-only reference 's'
अब मेरे वास्तविक मामले में सूची एक वर्ग पर सदस्य चर से बनी है।
अब, यह काम नहीं करता है क्योंकि अभिव्यक्ति बन जाती है initializer_list<int>
जो वास्तव में क, ख, ग, और घ की नकल करता है - इसलिए संशोधन की अनुमति भी नहीं देता है।
मेरा सवाल दो गुना है:
क्या इस तरह लूप के लिए रेंज-आधारित लिखने की अनुमति नहीं देने के पीछे कोई प्रेरणा है? जैसे। शायद नग्न ब्रेस अभिव्यक्ति के लिए एक विशेष मामला हो सकता है।
इस प्रकार के लूप को ठीक करने का एक वाक्यात्मक स्वच्छ तरीका क्या है ?
इस लाइन के साथ कुछ पसंद किया जाएगा:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
मैं सूचक को अप्रत्यक्ष रूप से एक अच्छा समाधान नहीं मानता (वह है {&a, &b, &c, &d}
) - किसी भी समाधान को तत्व संदर्भ को सीधे देना चाहिए जब पुनरावृत्त को डी-संदर्भित किया जाता है ।
initializer_list
const
सरणी पर ज्यादातर एक दृश्य है ।
{ &a, &b, &c, &d }
, तो आप न तो चाहते हैं:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
:।