代码之家  ›  专栏  ›  技术社区  ›  ERiSED

调用构造函数时,字符串参数传递char*report错误

  •  1
  • ERiSED  · 技术社区  · 2 年前
    template<typename T>
    class SharedValue {
    public:
        SharedValue(const T& t): valuePtr(new T(t)) {}
        
        const SharedValue& operator = (const T &t) {
            *valuePtr = t;
            return *this;
        }
      
    protected:
        dd_shared_ptr<T> valuePtr;
    };
    
    typedef SharedValue<std::string> SharedString;
     
    int main(int argc, const char * argv[]) {
        // compile succeeded
        SharedString str(argv[0]);
    
        // compile failed:
        SharedString str2 = argv[0];
       
        return 0;
    }
    

    这个 str2 施工失败,报告:

    No viable conversion from 'const char *' to 'SharedString' (aka 'SharedValue<basic_string<char, char_traits<char>, allocator<char>>>')
    

    为什么? str 成功,鉴于 str2型 失败了,有什么区别吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   user12002570    2 年前

    为什么str成功而str2失败,有什么区别吗?

    是的,两者之间有区别。特别是 str 我们有 直接初始化 在中时 str2 我们有 复制初始化 .

    程序的行为可以从 copy initialization documentation 其中规定:

    此外,在 复制初始化 必须生产 T 直接从初始值设定项 ,而,例如。 直接初始化 需要从初始值设定项到参数的隐式转换 T 的构造函数。

    (重点矿山)

    现在,让我们根据具体情况将其应用于给定的示例。

    案例1

    在此,我们考虑以下陈述:

    SharedString str2 = argv[0]; //this is copy initialization
    

    上述用途 复制初始化 . 和as SharedString 不能直接从 初始值设定项 的类型 const char* 在右侧,因为它需要隐式转换,所以根据上面引用的语句,不允许使用这种情况1。

    案例2

    在此,我们考虑以下陈述:

    SharedString str(argv[0]); //this is direct initialization
    

    而上述使用 直接初始化 既然有 隐式转换可用 (使用 正在转换构造函数 ),根据上述引用的声明,这一次是允许的。