为什么是true,false和nullptr prvalue?

时间:2019-09-01 13:11:11

标签: c++ c++11 language-lawyer rvalue

据我所知,nullptr是某个类的实例,如下所示:

const
class {
public:
    template<class T> // convertible to any type
    operator T*() const // of null non-member
    { return 0; } // pointer...
    template<class C, class T> // or any type of null
    operator T C::*() const // member pointer...
    { return 0; }
private:
    void operator&() const; // whose address can't be taken
} nullptr = {};

我想是

true 
false 

也是一些变量。那么事实就是说,prvalue是一个有害的黑客,违反了语言的类型系统吗?

如果nullptr只是一个关键字,那么如何从中派生类型?

typedef decltype(nullptr) nullptr_t;

1 个答案:

答案 0 :(得分:1)

看看标准:

  

8.1.1文字[expr.prim.literal]文字是主要表达式。其类型取决于其形式(5.13)。字符串文字是左值;   所有其他文字都是 prvalues

     

<...>

     

5.13.6布尔文字[lex.bool]布尔文字:false true

     

布尔文字是关键字false和true。这样的文字是   prvalue,类型为bool。

     

5.13.7指针文字[lex.nullptr]指针文字:nullptr

     

指针文字是关键字nullptr。它是类型的prvalue   std :: nullptr_t。 [注意:std :: nullptr_t是一种独特的类型,它是   既不是指针类型也不是成员类型的指针;而是一个prvalue   此类型是null指针常量,可以将其转换为null   指针值或空成员指针值。参见7.11和7.12。 - 结束   注意]

因此,如您所见,class _AppState extends State<App> { bool _hasImage; @override Widget build(BuildContext context) { _hasImage = false; return Material( child: Container( child: Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ Wrap( direction: Axis.vertical, alignment: WrapAlignment.start, children: <Widget>[ IconButton( icon: Icon(Icons.camera_alt), iconSize: 40.0, color: Color.fromRGBO(88, 60, 26, 1), onPressed: () {}, ), Text( 'Camera', style: TextStyle(color: Colors.white, fontSize: 17.0), ) ], ), Wrap( direction: Axis.vertical, alignment: WrapAlignment.start, children: <Widget>[ IconButton( icon: Icon(Icons.image), iconSize: 40.0, color: Color.fromRGBO(88, 60, 26, 1), onPressed: () {}, ), Text( 'Gallery', style: TextStyle(color: Colors.white, fontSize: 17.0), ) ], ), if (_hasImage) // this is what you need Wrap( direction: Axis.vertical, alignment: WrapAlignment.start, children: <Widget>[ IconButton( icon: Icon(Icons.delete), iconSize: 40.0, color: Color.fromRGBO(88, 60, 26, 1), onPressed: () {}, ), Text( 'Remove', style: TextStyle(color: Colors.white, fontSize: 17.0), ) ], ) ], ), ), ), ); } } with cte (pos_id, pos_count, pos_seq) as ( select pos_id, pos_count, 1 as pos_seq from mytable union all select pos_id, pos_count, pos_seq + 1 from cte where pos_seq < pos_count and pos_count <> 999 ) select * from cte order by pos_id, pos_seq; / nullptr都遵循共同的规则。唯一的例外是字符串文字(因为它本质上是一个数组)。