nullptr rvalue怎么样?

时间:2016-07-10 22:45:50

标签: c++ language-lawyer rvalue nullptr

在查看$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的实施时,我注意到的是nullptrnullptr,这意味着我们可以做这样的事情

rvalue

但是std::nullptr_t&& nullref = nullptr; 怎么可能nullptr因为实现类似于此

rvalue

这是核心功能吗?我错过了什么?

2 个答案:

答案 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]

我同意你自己无法在用户空间重新实现这个标准,但那也是每个其他关键字的情况。

仅包含关键字truefalse的表达式也是rvalues,如果您有好奇心。

  

[C++14: 2.14.6/1]:布尔文字是关键字falsetrue。这些文字是prvalues,类型为bool

答案 1 :(得分:4)

如果备选方案#1是nullptr的定义,那么你是对的,它是一个左值。但是,它可能被迫使用这样的东西:

const class __nullptr_t {...} __nullptr = {};
#define nullptr (__nullptr_t(__nullptr));

这不是最终标准化的。在实际的C ++ 11中,nullptr是一个文字,与3.14'x'相同。