문제

차이점은 무엇입니까?

(type)value

그리고

type(value)

C ++에서?

도움이 되었습니까?

해결책

다른 점이 없다; 표준에 따라 (§5.2.3) :

간단한 유형 스피커 (7.1.5)에 이어 괄호화 된 발현 목록은 표현 목록에 주어진 지정된 유형의 값을 구성합니다. 표현 목록이 단일 표현 인 경우, 유형 변환 표현식은 해당 캐스트 표현식 (5.4)과 동일합니다 (정의 및 의미로 정의 된 경우).

질문이 지정된 이후 type(value) 그리고 (type)value, 전혀 차이가 없습니다.

쉼표로 분리 된 경우에만 목록 값의 차이가있을 수 있습니다. 이 경우 :

표현 목록이 단일 값 이상을 지정하는 경우, 유형은 적절하게 선언 된 생성자 (8.5, 12.1)가있는 클래스가되어야하며, 표현 T (X1, X2, ...)는 선언 t t와 효과적입니다. (x1, x2, ...); 일부 발명 된 임시 변수 t의 경우 결과는 rvalue로서 t의 값입니다.

Troubadour가 지적했듯이, 특정 유형의 이름이 있습니다. type(value) 버전은 단순히 컴파일하지 않습니다. 예를 들어:

char *a = (char *)string;

컴파일하지만 :

char *a = char *(string);

하지 않을 것이다. 이름이 다른 동일한 유형 (예 : typedef)하지만 작동 할 수 있습니다.

typedef char *char_ptr;

char *a = char_ptr(string);

다른 팁

다른 점이 없다; C ++ 표준 (1998 및 2003 판) 은이 시점에 대해 분명합니다. 다음 프로그램을 시도해보십시오. 무료 미리보기와 같이 호환되는 컴파일러를 사용하십시오. http://comeaucomputing.com/tryitout/.

#include <cstdlib>
#include <string>
int main() {
  int('A'); (int) 'A'; // obvious
  (std::string) "abc"; // not so obvious
  unsigned(a_var) = 3; // see note below
  (long const&) a_var; // const or refs, which T(v) can't do
  return EXIT_SUCCESS;
}

메모: unsigned(a_var) 다르지만 정확한 토큰이 다른 것을 의미 할 수있는 방법을 보여줍니다. 이름이 지정된 변수를 선언합니다 a_var 서명되지 않은 유형의 캐스트가 아닙니다. (기능이나 배열의 포인터에 익숙하다면 주변의 파렌을 사용해야하는 방법을 고려하십시오. p 같은 유형에서 void (*pf)() 또는 int (*pa)[42].)

(이 진술은 가치를 사용하지 않고 거의 확실하게 오류가 될 실제 프로그램에서는 경고가 생성됩니다.

둘 다 캐스트 일 때 차이는 없지만 때로는 '유형 (값)이 캐스트가 아닙니다.

다음은 표준 초안 N3242, 섹션 8.2.1의 예입니다.

struct S 
{
    S(int);
};

void foo(double a) 
{
    S w( int(a) ); // function declaration
    S y( (int)a ); // object declaration
}

이 경우 'int (a)'는 값이 아니기 때문에 'int (a)'는 캐스트가 아닙니다. 중복 괄호로 둘러싸인 매개 변수 이름입니다. 문서에 나타납니다

기능 스타일 캐스트와 6.8에 언급 된 선언 사이의 유사성으로 인해 발생하는 모호성도 선언의 맥락에서 발생할 수 있습니다. 이러한 맥락에서, 선택은 매개 변수 이름 주변의 중복 괄호 세트가있는 함수 선언과 이니셜 라이저로서 기능 스타일 캐스트가있는 객체 선언 사이의 선택입니다. 6.8에 언급 된 모호성과 관련하여 결의안은 선언 선언 일 수있는 구성을 고려하는 것입니다.

C에는 아니오가 있습니다 type (value), C/C ++에서 type (value) 그리고 (type) value 허용됩니다.

C ++의 옵션을 설명하려면 (한 명만 안전 점검이 있습니다)

#include<boost/numeric/conversion/cast.hpp> 

using std::cout;
using std::endl;
int main(){

    float smallf = 100.1;

    cout << (int)smallf << endl; // outputs 100 // c cast
    cout << int(smallf) << endl; // outputs 100 // c++ constructor = c cast

    cout << static_cast<int>(smallf) << endl; // outputs 100
//  cout << static_cast<int&>(smallf) << endl; // not allowed
    cout << reinterpret_cast<int&>(smallf) << endl; // outputs 1120416563
    cout << boost::numeric_cast<int>(smallf) << endl; // outputs 100

    float bigf = 1.23e12;

    cout << (int)bigf << endl; // outputs -2147483648
    cout << int(bigf) << endl; // outputs -2147483648

    cout << static_cast<int>(bigf) << endl; // outputs -2147483648
//  cout << static_cast<int&>(bigf) << endl; // not allowed
    cout << reinterpret_cast<int&>(bigf) << endl; // outputs 1401893083
    cout << boost::numeric_cast<int>(bigf) << endl; // throws bad numeric conversion
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top