2012-11-20 2 views
3

왜이 문장이 C++에서 유효합니까?매개 변수 사양의 개체

qi::rule<Iterator, std::string(), skipper<Iterator> > name; 

여기에서 추출 :

규칙의 정의는 (재개) 다음

template <typename Iterator, typename T1, typename T2, 
          typename T3, typename T4> 
struct rule : boost::proto::extends<bla, bla>, parser<bla, bla> 
{ 
    bla, bla 
}; 

여기에서 추출 :

,617

규칙 정의그러나 나는 그것을 객체 전송 유형을 기대하고있다. 것이 가능하다?

답변

3

여기에서 std::string()std::string을 반환하고 매개 변수가없는 형식을 의미합니다. 예를 들어,

std::string foo() { return "Foo!\n"; } 

또는

struct Foo 
{ 
    std::string operator()() const { return "Foo!\n"; } 
}; 
+0

의 인스턴스는이 모호 하나의 이유 때문에 템플릿 인수는 ((A) 유형 또는이 될 수 있다는 사실에 떨어져 있음을 알아 흥미로운 일이 될 수 있습니다 b) 컴파일 타임 상수 적 표현. 생성자가'constexpr'이 될 수 없으므로 컴파일러는 객체를 생성하지 않고 함수 유형을 선언한다는 것을 명확하게 알 수 있습니다. C++ FQA는 http://yosefk.com/c++fqa/ctors.html#fqa-10.2에 좋은 단락을 가지고 있습니다. – sehe

+0

@ 저의 이해는 생성자 **가'constexpr'이 될 수 있지만' std :: string'은 정수형이 아니기 때문에,'std :: string()'은 비 형형 적분식이 될 수 없습니다. – juanchopanza

+0

좋아, 꽤 멋지다! http://en.cppreference.com/w/cpp/language/constexpr. 정밀도에 감사드립니다. – sehe

3

개체를주지 마십시오. std::string()은 인수를 사용하지 않고 std::string을 반환하는 함수 유형입니다.