본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 함수 삭제 (function delete)

by 심찬 2021. 8. 9.

 

 

 

함수 삭제(function delete)

 

지금까지 대부분은 에러를 발생시키지 않게 하기 위한 코딩을 했다면, 제대로 코딩을 하기 위해 컴파일 에러를 발생시키는(?) 함수 삭제에 대해 살펴보겠습니다.

 

함수 삭제 코드를 실제 본 적은 없어서 이게 왜 필요한지 잘 이해가 어려웠으나 아래 예시를 통해 이해했습니다.

 

함수 삭제는 간단합니다. 아래 처럼 함수 선언 뒤에 = delete;를 붙여주면 함수 삭제가 됩니다.

컴파일 과정에서 삭제된 함수를 호출하면 에러가 발생합니다.

void foo(int) = delete; // 함수 삭제

int main()
{
    foo(10); // 컴파일 에러 발생
}

 

왜 함수 삭제가 필요한걸까?

> 암시적 변환에 의한 의도치 않은 함수 호출을 방지하기 위해서 사용합니다.

 

함수 삭제를 사용하지 않고 선언부를 만들어 놓고 호출하면 link error가 발생합니다.

암시적 형 변환과 같은 c++의 영리한 기능(?) 때문에 실행되면 안되는 코드가 실행되어 잘못된 결과를 가져올 수 있습니다. double 형은 함수가 구현되어 있지 않지만 컴파일 과정에서 문제없이 패스가 됩니다. double형을 제대로 계산하지도 않고 int 형으로 변환되어 계산되므로 엉뚱한 값이 나오게 됩니다.

 

아래는 함수 삭제를 사용하지 않고 선언부만 만들고 호출했을 때 발생되는 에러를 확인해봤습니다.

int gcd(int a, int b)  // 최대 공약수 구하는 함수
{
	return b != 0 ? gcd(b, a % b) : a;
}

//선언부만 만들어 놓고 호출하면 link error가 발생한다. (컴파일 타임에 오류 발생이 아님)
double gcd(double a, double b); // 함수 선언만 

int main()
{
    gcd(2, 10);    // ok

    // double 형을 암시적 형 변환 (-> int)을 통해 gcd(int a, int b)를 호출한다.
    gcd(2.2, 4.3); // gcd(double, double)
}

아래와 같이 link error가 발생합니다.

undefined reference to `gcd(double, double)'

collect2: error: id returned 1 exit status

 

아래와 같이 함수 삭제를 해주면, 컴파일 과정에서 삭제된 함수가 사용되었다면서 에러를 줍니다. 

int gcd(int a, int b)  // 최대 공약수 구하는 함수
{
	return b != 0 ? gcd(b, a % b) : a;
}

// 함수를 삭제하면 컴파일 에러가 발생되기 때문에 잘못된 코드 작성을 방지할 수 있다.
double gcd(double a, double b) = delete;

int main()
{
	gcd(2, 10);    // ok

    // double 형을 암시작 형 변환 (-> int)을 통해 gcd(int a, int b)를 호출한다.
	gcd(2.2, 4.3); // gcd(double, double)  
    
    
}

error: use of deleted function 'double gcd(double, double)'

 

템플릿과 함수에서 함수가 우선순위를 갖습니다.

그래서 char형을 받아 처리해 주는 char square(char) 함수를 삭제 해주면, squre('a'); 를 처리해주지 않고 에러가 발생합니다. 

템플릿이 특정 타입의 함수를 생성하지 못하도록 하기 위해 아래와 같이 함수 삭제를 활용할 수 있습니다.

컴파일러가 자동으로 생성하는 멤버함수를 생성하지 못하게 하기 위해 사용할 수 있습니다.

template<typename T> 
T square( T a )
{
    return a * a;
}

char square(char) = delete;

int main()
{
    square(3);
    square(3.3);
    square('a'); // error.                                                   
}

 

 

열공

댓글