다음은 컴파일 되지 않습니다 .
#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>
실제로 a, b, c 및 d를 복사하는 표현식이되기 때문에 작동하지 않습니다 . 따라서 수정도 허용하지 않습니다.
내 질문은 두 가지입니다.
이런 식으로 범위 기반 for 루프를 작성하지 못하게하는 동기가 있습니까? 예. 벌거 벗은 괄호 표현에는 특별한 경우가있을 수 있습니다.
이 유형의 루프를 고정 하는 구문적인 깔끔한 방법은 무엇입니까 ?
이 라인을 따르는 것이 선호됩니다.
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 }
입니다.