小编Bra*_*ook的帖子

为什么const为隐式转换?

在广泛阅读ISO/IEC 14882,编程语言 - C++后,我仍然不确定为什么const需要使用单个参数构造函数隐式转换为用户定义的类型,如下所示

#include <iostream>

class X {
public:
   X( int value ) {
      printf("constructor initialized with %i",value);
   }
}

void implicit_conversion_func( const X& value ) {
   //produces "constructor initialized with 99"
}

int main (int argc, char * const argv[]) {
   implicit_conversion_func(99);
}
Run Code Online (Sandbox Code Playgroud)



从第4节第3行开始

当且仅当声明T t = e时,表达式e可以隐式转换为类型T. 对于一些发明的临时变量t(8.5),其形式良好.某些语言结构要求将表达式转换为布尔值.在这样的上下文中出现的表达式e被称为在上下文中转换为bool并且当且仅当声明bool t(e)时才是格式良好的; 对于一些发明的临时变量t(8.5),其形式良好.隐式转换的效果与执行声明和初始化相同,然后使用临时变量作为转换的结果.如果T是左值引用类型(8.3.2),则结果是左值,否则为右值.当且仅当初始化将其用作左值时,表达式e用作左值.

接下来,我在8.5行6中找到了与用户定义类型相关的初始化器部分

如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型.

最后,我以12.3第2行结束了有关用户定义的转换的信息

用户定义的转换仅在明确无误的情况下应用(10.2,12.3.2).

不用说,10.2和12.3.2没有回答我的问题.

  1. 有人可以了解const隐含转换的影响吗?
  2. 是否使用const12.3第2行使转换"明确"?
  3. 是否会const以某种方式影响第4节中谈到的左值与右值?

c++ constructor const rvalue implicit-conversion

12
推荐指数
1
解决办法
3075
查看次数

指针接收器的nil不一致(Go bug?)

当我偶然发现这种明显的不一致时,我正在做一个简单的链表接口来了解Go接口.nextT总是零,但返回值next()不是.

package main

import (
    "fmt"
)

type LinkedList interface {
    next() LinkedList
}

type T struct {
    nextT *T
}

func (t *T) next() LinkedList {
    //uncomment to see the difference
    /*if t.nextT == nil {
         return nil
    }*/
    return t.nextT//this is nil!
}

func main() {
    t := new(T)
    fmt.Println(t.nextT == nil)

    var ll LinkedList
    ll = t
    fmt.Println(ll.next() == nil)//why isn't this nil?
}
Run Code Online (Sandbox Code Playgroud)

next()我得到的没有零检查(我不应该这样做)

true
false
Run Code Online (Sandbox Code Playgroud)

有了它,我得到了预期的结果

true
true
Run Code Online (Sandbox Code Playgroud)

我是否因为某种原因发现了一个错误或者这个意外的故意?使用zip安装在没有MSI的Go版本1的Windows上运行

linked-list go

5
推荐指数
1
解决办法
201
查看次数

标签 统计

c++ ×1

const ×1

constructor ×1

go ×1

implicit-conversion ×1

linked-list ×1

rvalue ×1