参数说明中的对象 为什么这个句子在C++中有效?< /P> qi::rule<Iterator, std::string(), skipper<Iterator> > name; qi::规则名称;

参数说明中的对象 为什么这个句子在C++中有效?< /P> qi::rule<Iterator, std::string(), skipper<Iterator> > name; qi::规则名称;,c++,templates,boost,boost-spirit,C++,Templates,Boost,Boost Spirit,摘自: 规则的定义如下(续): template <typename Iterator, typename T1, typename T2, typename T3, typename T4> struct rule : boost::proto::extends<bla, bla>, parser<bla, bla> { bla, bla }; 模板 结构规则:boost::proto::

摘自:

规则的定义如下(续):

template <typename Iterator, typename T1, typename T2,
                             typename T3, typename T4>
struct rule : boost::proto::extends<bla, bla>, parser<bla, bla>
{
  bla, bla
};
模板
结构规则:boost::proto::extends,解析器
{
布拉,布拉
};
摘自:


规则定义需要一个类型,但我给它发送了一个对象。有可能吗?

你没有给它一个对象
std::string()
是不带参数并返回
std::string

的函数类型。在本上下文中,
std::string()
表示返回
std::string
且没有参数的函数类型。比如说,

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

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

值得注意的是,这是明确的原因之一,因为模板参数只能是(a)类型或(b)compiletime常量整数表达式。由于构造函数不能是
constexpr
,编译器很清楚,您不是在构造对象,而是在声明函数类型。C++ FQA有一个很好的段落,上面的“我的理解是构造函数可以是代码> CONExPRP< /COD>”,但是自从 STD::String 不是一个整数类型,<代码> STD::String()/<代码无论如何不能是非类型的积分表达式。谢谢你的精确性。