使用std :: string和char *

时间:2016-08-19 19:19:47

标签: c++ most-vexing-parse

这是我之前提出的问题的后续问题:C++ compile error constructing object with rvalue std::string,我从中了解到最令人烦恼的解析。

我现在理解问题的要点,但是我仍然不太了解一个剩余的语法项目,我想作为一个独立的问题,因为讨论在上一篇文章中已经很长了。

鉴于此代码:

#include <iostream>
#include <string>

class Foo
{
    public:
        Foo(double d)
            : mD(d)
        {
        }

        Foo(const std::string& str)
        {
            try
            {
                mD = std::stod(str);
            }
            catch (...)
            {
                throw;
            }
        }

        Foo(const Foo& other)
            : mD(other.mD)
        {
        }

        virtual ~Foo() {}

    protected:
        double mD;
};

class Bar
{
    public:
        Bar(const Foo& a, const Foo& b)
            : mA(a)
            , mB(b)
        {
        }

        virtual ~Bar() {}

    protected:
        Foo mA;
        Foo mB;
};

int main(int argc, char* argv[])
{
    if (argc < 3) { return 0; }

    Foo a(std::string(argv[1]));
    Foo b(std::string(argv[2]));

    Bar wtf(a, b);
}

我现在明白,行Foo a(std::string(argv[1]));可以解释为:

(1)创建一个名为a的Foo,其匿名std::string使用char*创建。 (我想要的解释)

(2)名为a的函数的声明(不是定义),它采用std::string*

从原始问题的答案中,我了解到函数可以在另一个函数的范围内声明。这对我来说是新的,但似乎有理由,我可以买它。

尽管如此,我能够将std::string(argv[1])解释为std::string*

argv [1]是一个char *,所以我仍然不明白为什么该行不会被解释为使用std::string构建的匿名char*。毕竟,我已经使用过类似于以下几百次的代码而没有仔细检查这是否会导致除std::string构造函数构造char*之外的任何其他内容:

#include <iostream>
int main()
{
    char* pFoo[] = {"foo"};
    std::string str(pFoo[0]);
    std::cout << str << std::endl;
    return 0;
}

我正在理解最棘手的解析问题;如果有人可以进一步解释这个最后的琐事,那可能会让我超越边缘。

谢谢。

1 个答案:

答案 0 :(得分:4)

Foo a(std::string(argv[1]));

声明一个名为a的函数,它返回Foo并且有一个argv类型的参数(名为std::string[1])。由于数组函数参数始终用指针参数替换,因此函数参数的实际类型变为std::string*