构造函数委托中的C++调用函数
在c++11中,构造函数可以转发到初始化列表中的另一个构造函数 可以在初始化列表中调用函数,如下所示 在构造函数委托中调用函数也可以吗 我试过这样的代码:构造函数委托中的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
#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;
}