在查看$all_players = DB::table('example_players')->leftJoin('example_votes', 'example_votes.from_player_id', '=', 'example_players.id')
->select('example_players.id', 'example_players.name', 'example_players.display_name', 'example_players.role', 'example_players.picture', DB::raw("count(example_votes.id) as nbr_votes"))
->groupBy('example_players.id')
->orderBy(DB::raw("count(examples_votes.id)"),'desc')
->get();
here的实施时,我注意到的是nullptr
是nullptr
,这意味着我们可以做这样的事情
rvalue
但是std::nullptr_t&& nullref = nullptr;
怎么可能nullptr
因为实现类似于此
rvalue
这是核心功能吗?我错过了什么?
答案 0 :(得分:16)
实施与此无关。
关键字nullptr
被定义为产生一个右值表达式,并且它是它的结尾。
[C++14: 2.14.7/1]
:指针文字是关键字nullptr
。它是std::nullptr_t
类型的prvalue。 [注意:std::nullptr_t
是一种不同的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的prvalue是一个空指针常量,可以转换为空指针值或null成员指针值。见4.10和4.11。 -end note]
我同意你自己无法在用户空间重新实现这个标准,但那也是每个其他关键字的情况。
仅包含关键字true
和false
的表达式也是rvalues,如果您有好奇心。
[C++14: 2.14.6/1]:
布尔文字是关键字false
和true
。这些文字是prvalues,类型为bool
。
答案 1 :(得分:4)
如果备选方案#1是nullptr
的定义,那么你是对的,它是一个左值。但是,它可能被迫使用这样的东西:
const class __nullptr_t {...} __nullptr = {};
#define nullptr (__nullptr_t(__nullptr));
这不是最终标准化的。在实际的C ++ 11中,nullptr
是一个文字,与3.14
或'x'
相同。