728x90
문제
lvalue에 사용할 수 있는 참조 연산자 &를 rvalue에 사용하고 있어서 발생한 문제이다.
내 경우엔 DirectX 예제 코드를 vs2022로 컴파일하던 중 C2102 에러가 발생했다. 원인이 되는 코드는 어떤 변수에 구조체를 할당하지 않고, 바로 함수의 매개변수로 그 구조체의 주소를 넘겨주고 있었다. 말로 하니 어려운데 아래 코드와 비슷하다.
struct MyStruct
{
int i;
};
MyStruct bar ()
{
MyStruct result = { 5 };
return result;
}
/* won't compile; 'lvalue required as unary & operand */
void qux ()
{
int *j = &bar().i;
}
해결
rvalue에 &연산을 하지 말고 lvalue에 할당해서 사용한다. 즉 변수에 할당해서 그 변수를 통해서 사용한다. 위의 코드를 고치면 다음과 같이 된다.
/* compiles OK */
void qux ()
{
MyStruct result = bar();
int* j = &result.i;
}
또는 Visual Studio의 Conformance mode(규칙 또는 준수 모드)를 끈다. 이 모드는 C++ 표준을 준수하게 만드는 모드이다. 아마 위와 같은 코드가 표준을 준수하지 않아서 컴파일이 안되는 모양이다. 사실 구조체를 lvalue에 할당해서 그것을 통해서 바꿔주는게 맞긴 한데, DirectX12 예제 코드가 전부 이런식으로 되어있어서... 모드를 꺼주는 게 편하다.
자세한 내용은 Microsoft Docs에 나와 있다.
관련 링크
728x90