2012-11-20 24 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 
}; 

從這裏提取:

規則定義需要一個類型,但是我把它的對象。有可能的?

回答

3

在這種情況下,std::string()表示返回std::string並且沒有參數的東西的類型。例如,

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

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

一個實例可能是值得注意的一個原因,這是明確的是由於該模板參數只能是(一)類型或( 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的函數的類型。