码迷,mamicode.com
首页 > 编程语言 > 详细

C++复制初始化的限制

时间:2017-07-16 12:27:36      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:init   style   string   构造函数   字符   不能   struct   ide   sid   

         相比于直接初始化,复制初始化有更加严格的限制。

 

1:在复制初始化时,不能使用声明为explicit的构造函数进行的隐式转换。而直接初始化则是允许的:

struct Exp { explicit Exp(const char*) {} }; // not convertible from const char*
Exp e1("abc");  // OK
Exp e2 = "abc"; // Error, copy-initialization does not consider explicit constructor
 
struct Imp { Imp(const char*) {} }; // convertible from const char*
Imp i1("abc");  // OK
Imp i2 = "abc"; // OK

 

         Exp类中的构造函数声明为了explicit,因此,复制初始化Exp e2 = "abc"将会发生编译错误:error: conversion from ‘const char [4]’ to non-scalar type ‘Exp’ requested.

         Imp类中的构造函数没有声明为explicit,因此,可以用字符串”abc”进行直接初始化或复制初始化Imp的对象。

 

2:在复制初始化中,使用隐式转换时,必须是从初始化器(=右边的表达式)可以直接转换为被初始化对象,而不是间接的。在直接初始化中,可以使用从初始化器到构造函数参数的隐式转换。

struct S { S(std::string) {} }; // implicitly convertible from std::string

S s1("abc"); // OK: conversion from const char[4] to std::string
S s2 = "abc"; // Error: no conversion from const char[4] to S
S s3 = std::string("abc"); // OK: conversion from std::string to S

 

         类S有一个接受std::string参数的构造函数,因此,可以使用”const char*”直接初始化S的对象s1。这里的转换序列是:const char* à std::string à struct S;

         复制初始化中,则不允许这种转换,因为它不是直接转换,而是间接转换,因此,s2的初始化就会发生编译错误;

         复制初始化中,可以使用直接隐式转换,因此,可以使用std::string的对象,初始化s3。

 

 

参考:

 

http://en.cppreference.com/w/cpp/language/copy_initialization

 

C++复制初始化的限制

标签:init   style   string   构造函数   字符   不能   struct   ide   sid   

原文地址:http://www.cnblogs.com/gqtcgq/p/7189888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!