[C++] most vexing parse

keltion·2024년 3월 27일

C++

목록 보기
5/5

most vexing parse란

선언으로 해석할 수 있는 것은 항상 선언으로 해석해야 한다는 C++ 규칙에서 비롯된 하나의 부작용이다. (Effective Modern C++ 참조)

Cat cat(); // Cat 객체를 반환하는 cat함수 선언

즉 위 코드는 Cat의 객체를 생성하는 것으로 해석되지 않고 Cat 객체를 반환하는 cat함수를 선언하는 것으로 해석이 된다.
그렇다면 아래와 같은 경우에 결과가 어떻게 출력되는지 예측해보자.

#include <iostream>

class Cat
{
public:
	Cat()
	{
		std::cout << "Cat constructor" << std::endl;
	}

	Cat(const Cat& other)
	{
		std::cout << "Cat copy constructor" << std::endl;
	}

	Cat(Cat&& other) noexcept
	{
		std::cout << "Cat move constructor" << std::endl;
	}

	Cat& operator=(const Cat& other)
	{
		std::cout << "Cat copy assignment" << std::endl;
		return *this;
	}

	Cat& operator=(Cat&& other) noexcept
	{
		std::cout << "Cat move assignment" << std::endl;
		return *this;
	}
private:
};

class Zoo
{
public:
	Zoo(Cat cat) : cat_{ cat } {}
private:
	Cat cat_;

};
int main()
{
	Zoo zoo(Cat());
}

결과는 아무런 출력도 되지 않는다. 마찬가지로 Zoo객체를 반환하고, Cat객체를 반환하는 매개변수가 없는 함수포인터를 매개변수로 받는 zoo함수 선언으로 해석되기 때문이다.

따라서 most vexing parse를 회피하기 위해서 객체 선언시 중괄호 초기화를 사용하는 것을 권장하기도 한다.

	Zoo zoo{ Cat() };

0개의 댓글