>백엔드 개발 >C++ >포인터나 참조가 아닌 인수의 불변성에만 기초하여 C 함수를 오버로드할 수 없는 이유는 무엇입니까?

포인터나 참조가 아닌 인수의 불변성에만 기초하여 C 함수를 오버로드할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-11 21:25:03431검색

Why can't C   functions be overloaded based solely on the constness of a non-pointer, non-reference argument?

Const 인수를 사용한 함수 오버로딩: 수행할 수 없는 이유

C에서 함수 오버로딩은 이름이 같은 여러 함수를 허용하지만 클래스 내에서 공존할 수 있는 다양한 매개변수 목록 그러나 포인터나 참조가 아닌 매개변수의 불변성만을 기반으로 함수를 오버로드할 수는 없습니다.

다음 코드 예제를 고려하세요.

#include <iostream>
using std::cout;

class Test {
public:
    Test() {}
    int foo(const int) const;    // const function
    int foo(int);                // non-const function
};

int main() {
    Test obj;
    Test const obj1;
    int variable = 0;
    do {
        obj.foo(3); // Call the const function
        obj.foo(variable); // Attempt to call the non-const function
        variable++;
        usleep(2000000);
    } while (1);
}

int Test::foo(int a) {
    cout << "NON CONST" << std::endl;
    a++;
    return a;
}

int Test::foo(const int a) const {
    cout << "CONST" << std::endl;
    return a;
}

코드에서 알 수 있듯이 인수의 불변성을 기반으로 foo 메소드를 오버로드하려고 시도합니다. 즉, const 인수를 허용하는 const 버전과 non-const 인수를 허용하는 비const 버전입니다. 그러나 이 코드를 사용하면 함수를 오버로드할 수 없다는 컴파일 오류가 발생합니다.

이 오류는 C가 비포인터, 비참조 유형의 상수에만 기반한 오버로드를 허용하지 않기 때문에 발생합니다. 그 이유는 값 인수를 전달할 때 실제 인수가 호출된 함수 내의 임시 변수에 복사되기 때문입니다. 이 복사본은 원래 인수와 다르며 해당 상수는 원래 인수의 상수성에 영향을 주지 않습니다.

따라서 위의 예에서 obj.foo(3)를 호출하면 리터럴의 임시 복사본이 됩니다. 3이 생성되어 const 함수에 전달됩니다. 마찬가지로, obj.foo(variable)를 호출하면 변수의 임시 복사본이 생성되어 const가 아닌 함수에 전달됩니다. 컴파일러는 인수의 불변성에만 기초하여 이 두 가지 경우를 구별할 수 없습니다.

요약하자면, 비포인터, 비참조 유형의 불변성을 기반으로 하는 함수 오버로드는 C에서 허용되지 않습니다. 값 인수의 상수성은 함수 내부 인수의 상수성에 영향을 주지 않으며, 컴파일러는 인수 유형만으로는 둘을 구별할 수 없기 때문입니다.

위 내용은 포인터나 참조가 아닌 인수의 불변성에만 기초하여 C 함수를 오버로드할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.