我在编写 boost::spirit::qi
规则时偶然发现了这一点。我写了一个不正确的规则声明,我通过添加括号修复了它。我突然想到,我不知道为什么这会有所不同。
char
和 char()
有什么区别?
这是一个最小的示例,显示了它的相关性。
测试 A
和 B
是等价的。测试 C
编译但未通过测试。
测试 D
被注释掉并且不会编译并显示消息:C2440: 'static_cast' : cannot convert from 'skipper_type' to 'char'
。 (对于稍微复杂的类型,错误将是 C2664
)
测试示例只是为了说明使用 char
与 char()
的区别。我的问题是两者之间的区别是什么。
#include <iostream>
#include <string>
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>
#include <boost/spirit/include/qi.hpp>
using std::string;
namespace qi = boost::spirit::qi;
using Iterator = std::string::iterator;
using Skipper = qi::space_type;
Skipper skipper = qi::space;
void CHECK_ITERATOR(Iterator p, Iterator end)
{
if (p != end)
{
BOOST_CHECK_MESSAGE(p == end, "Remaining: " << string(p, end));
}
}
BOOST_AUTO_TEST_CASE(parse_char_type_B)
{
qi::rule<Iterator, Skipper, char()> rule = qi::char_;
char expected = 'B';
char actual = 0;
string toParse(&expected, (&expected) + 1);
Iterator it = toParse.begin();
BOOST_REQUIRE(qi::phrase_parse(it, toParse.end(), rule, skipper, actual));
CHECK_ITERATOR(it, toParse.end());
BOOST_CHECK_EQUAL(expected, actual);
}
BOOST_AUTO_TEST_CASE(parse_char_type_C)
{
qi::rule<Iterator, Skipper, char> rule = qi::char_;
char expected = 'C';
char actual = 0;
string toParse(&expected, (&expected) + 1);
Iterator it = toParse.begin();
BOOST_REQUIRE(qi::phrase_parse(it, toParse.end(), rule, skipper, actual));
CHECK_ITERATOR(it, toParse.end());
BOOST_CHECK_EQUAL(expected, actual);
}
BOOST_AUTO_TEST_CASE(parse_char_type_D)
{
//qi::rule<Iterator, char, Skipper> rule = qi::char_;
char expected = 'D';
char actual = 0;
string toParse(&expected, (&expected) + 1);
Iterator it = toParse.begin();
//BOOST_REQUIRE(qi::phrase_parse(it, toParse.end(), rule, skipper, actual));
//CHECK_ITERATOR(it, toParse.end());
//BOOST_CHECK_EQUAL(expected, actual);
}
最佳答案
char()
是一个没有参数的函数类型,返回一个char
。
char
是表示字符的默认类型。
当然,这只是在需要类型的情况下。其他上下文不同,例如char a = char();
值初始化 a
。
关于c++ - c++中 'char()'和 'char'有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879454/