Nice programing

C ++ 기본 인수를 다른 인수로 초기화 할 수 있습니까?

nicepro 2020. 12. 9. 21:48
반응형

C ++ 기본 인수를 다른 인수로 초기화 할 수 있습니까?


이 질문에 이미 답변이 있습니다.

C ++의 기본 인수의 경우 값이 상수 여야합니까, 아니면 다른 인수가 수행합니까?

즉, 다음이 작동 할 수 있습니까?

RateLimiter(unsigned double rateInPermitsPerSecond, 
            unsigned int maxAccumulatedPermits = rateInPermitsPerSecond);

현재 오류가 발생합니다.

RateLimiter.h : 13 : 오류 : 'rateInPermitsPerSecond'가이 범위에서 선언되지 않았습니다.


다른 인수는 기본값으로 사용할 수 없습니다. 표준 상태 :

8.3.6 기본 인수
...
9 해당 매개 변수에 대한 인수없이 함수가 호출 될 때마다 기본 인수가 평가됩니다. 함수 인수의 평가 순서는 지정되지 않습니다. 결과적으로, 함수의 매개 변수는 평가되지 않더라도 기본 인수에서 사용되지 않습니다.

다음 샘플로 설명합니다.

int f(int a, int b = a); // error: parameter a
                         // used as default argument

아니요, 함수 인수의 평가가 순서가 지정되지 않았기 때문에 작동하지 않습니다. 표준이 허용하지 않기 때문에 작동하지 않지만 나는 그것이 분명하다고 생각합니다.

대신 과부하를 사용하십시오.

void fun(int, int) {}

void fun(int i) {
    fun(i, i);
}

허용되지 않는 이유에 대한 논리적 설명을 찾고있었습니다.

이것은 실제로 좋은 질문입니다. 그 이유는 C ++가 인수 평가 순서를 요구하지 않기 때문입니다.

따라서 약간 더 복잡한 시나리오를 상상해 봅시다.

int f(int a, int b = ++a);

... followed by ...

int a = 1;
f(a);

C ++는 인수 평가 순서를 요구하지 않습니다. 기억하십니까?

그렇다면 b의 값은 무엇일까요?

f(a) 다음 중 하나로 평가할 수 있습니다.

f(1, 2), 또는 f(2, 2), 인수 평가 순서에 따라 다릅니다.

따라서 동작은 정의되지 않고 심지어 정의 할 수 없습니다.

또한 a와 b가 생성자와 복사 연산자에 부작용이있는 복잡한 객체 일 때 발생할 수있는 일을 고려하십시오.

이러한 부작용의 순서는 정의되지 않습니다.


표준이 허용하지 않기 때문에 그런 일을 할 수 없습니다. 그러나 기본 인수는 효과적으로 새 함수 오버로드를 정의하기 때문에 이러한 오버로드를 명시 적으로 정의하여 원하는 효과를 얻을 수 있습니다.

void RateLimiter(unsigned int rateInPermitsPerSecond, 
                 unsigned int maxAccumulatedPermits);

inline void RateLimiter(unsigned int rateInPermitsPerSecond)
{ return RateLimiter(rateInPermitsPerSecond,rateInPermitsPerSecond); }

이것은 언어가 제안한 바와 같이이를 금지하는 표준이 반 심함을 보여줍니다 ( "결과적으로 ...해서는 안됩니다 ..."). 그들은 명시 적 오버로드 선언이하는 것과 동일한 효과로 이것을 잘 정의하는 번거 로움을 겪고 싶지 않았습니다. 원하는 경우 기본 인수가 명시 적으로 제공된 인수 이후에 왼쪽에서 오른쪽으로 평가되도록 지정할 수 있습니다. . 이것은 함수 호출에서 인수 표현식의 평가 순서가 지정되지 않는다는 규칙에 영향을 미치지 않습니다 (기본 인수는 이러한 표현식에 대응하지 않기 때문입니다. 완전히 별개이며 동일한 어휘 범위에 있지도 않습니다). 반면에 (그들이했던 것처럼) 이것을 허용하지 않기를 원했다면, 그들은 "하지 않을 것"이라고 말했을 수도 있습니다.


C ++의 기본 인수의 경우 값이 상수 여야합니까, 아니면 다른 인수가 수행합니까?

인수의 기본값은 다른 인수가 될 수 없습니다. 그러나 그것이 상수 여야한다는 의미는 아닙니다. 함수 호출의 반환 값일 수 있습니다.

int getNextDefaultID()
{
   static int id = 0;
   return ++id;
}

struct Foo
{
   Foo(int data, int id = getNextDefaultID()) : data_(data), id_(id) {}
   int data_;
   int id_;
};

int main()
{
    Foo f1(10);      // Gets the next default ID.
    Foo f2(20, 999); // ID is specified.
}

참고 URL : https://stackoverflow.com/questions/37335383/can-ac-default-argument-be-initialized-with-another-argument

반응형