Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造函数委托中的C++调用函数_C++_C++11_Constructor_Initialization List - Fatal编程技术网

构造函数委托中的C++调用函数

构造函数委托中的C++调用函数,c++,c++11,constructor,initialization-list,C++,C++11,Constructor,Initialization List,在c++11中,构造函数可以转发到初始化列表中的另一个构造函数 可以在初始化列表中调用函数,如下所示 在构造函数委托中调用函数也可以吗 我试过这样的代码: #include <iostream> #include <string> #include <yaml-cpp/yaml.h> using namespace std; YAML::Node ParseFromFile(const string& filepath) { YAML::Nod

在c++11中,构造函数可以转发到初始化列表中的另一个构造函数

可以在初始化列表中调用函数,如下所示

在构造函数委托中调用函数也可以吗

我试过这样的代码:

#include <iostream>
#include <string>
#include <yaml-cpp/yaml.h>

using namespace std;

YAML::Node ParseFromFile(const string& filepath) {
  YAML::Node yaml;
  try {
    return YAML::LoadFile(filepath);
  } catch(const YAML::BadFile& e) {
    cout << "error";
  }
}

class A {
 public:
  A(YAML::Node yaml) {
    cout  << "Got" << endl;
  }
  A(const string& filepath) : A(ParseFromFile(filepath)) {}
};


int main(int argc, char** argv) {
  A a(string(argv[1]));
  YAML::Node yaml = ParseFromFile(string(argv[1]));
  A b(yaml);
  return 0;
}
对于上面的代码,只需向其传递一个空文件,它将只打印在初始化b时得到的一个文件

=======================================================================

将stringargv[1]替换为argv[1]可以使其工作,有什么想法吗?为什么?

回答编辑后的问题 问题是主文档的第一行,它被视为函数声明,而不是变量初始化,事实上,如果您使用clang编译它,它会给您一个警告:

警告:括号已作为函数声明消除歧义

这是由于标准AKA emphasis mine中§6.8歧义解决中的定义:

在涉及表达式语句的语法中存在歧义 and声明:具有函数样式的表达式语句 显式类型转换5.2.3作为其最左边的子表达式可以 与第一个声明符开始的声明不可区分 用一个。在这些情况下,声明就是一种声明

考虑以下示例:

#include <iostream>
#include <string>
#include <exception>
using namespace std;

struct A{
    string a;
    A(string s) : a(s){ cout<< "Ctor" <<endl;}
    A(int i) : A(to_string(i)){ }
};

void foo (A (*a)(string*)){
    cout<<"yay"<<endl;
}

int main(int argc, char** argv) {
    A         a1(     string(argv[1]) ); // function A a1(std::string*) declaration not a variable 
/*  ^         ^       ^
    |         |       |
return type   name   arg type 
Same as foo
*/
    // foo(a1);//  <- compiles but fails only due to linkage         
    A  a2 = A(string(argv[1])); // works
    A  a3{string(argv[1])}; // works
    A  a4(string{argv[1]}); // works
    A         a5(     ( string(argv[1]) ) ); // works allso but confusing imho
/*                    ^                 ^
notice extra paren.   |                 |
*/  
    return 0;
}
原问题的答复FWIW 为什么不试试呢

除非调用的函数将使用尚未初始化的成员,否则应该没有问题

例如:


什么意思?do_某事是如何不执行的?与您的问题无关,但如果您使用的是C++11功能,那么您拥有并且不必自己开发的可能性非常大。@Brian编辑了这个问题,上面只是一个示例,确切的情况不是int-to-string转换。@MinLin也许您应该发布实际的代码。也许你的代码没有调用你认为是的构造函数,这就是为什么你没有得到你期望的行为。如果你只是构造一个临时对象,而委托的构造函数没有任何副作用,可能是编译器优化了结构。无论如何,你不应该使用当前类的任何非静态成员,对象的生命周期还没有开始。初始化甚至还没有开始,因为主构造函数还没有开始。调用全局函数(如问题中所述)、构造函数参数的成员或当前类的静态成员都应该可以。@SCI如果您的代码执行得很好,我已经公布了实际问题,它不起作用。@BenVoigt您可以使用非静态成员,只要您注意声明它们的顺序:
#include <iostream>
#include <string>
using namespace std;

class A {
 public:
  A(string x) {
    cout  << "Got "  << x << endl;
  }
  A(int x) : A(std::to_string(x)) {}
};


int main() {
    A a(15);
    return 0;
}