zoukankan      html  css  js  c++  java
  • C++复制初始化的限制

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

     

    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

  • 相关阅读:
    Dubbo学习记录(一)
    Quartz定调度简单案例
    oracle中批量生成字段类型的脚本
    MsSQLserver中修改字段值系统自动生成的脚本
    根据oracle的主键列生成SQLserver的主键
    SQLServer2005如何批量修改架构名
    win10 下oracle tns通过IP无法访问的解决办法
    PD PDM模型中关系设置为概念模型样式
    PB12.5.2安装
    Java Web 项目目录规范
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7189888.html
Copyright © 2011-2022 走看看