在广泛阅读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没有回答我的问题.
const隐含转换的影响吗?const12.3第2行使转换"明确"?const以某种方式影响第4节中谈到的左值与右值?当我偶然发现这种明显的不一致时,我正在做一个简单的链表接口来了解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上运行