C++11 如何要求类型通过用户定义的文本?
我有一个POD类型C++11 如何要求类型通过用户定义的文本?,c++11,constructor,initializer-list,constexpr,user-defined-literals,C++11,Constructor,Initializer List,Constexpr,User Defined Literals,我有一个POD类型Foo,我想要求用户通过我的用户定义文本实例化它(默认的复制、移动和分配都可以): 举个例子,我想要这样的东西: int main() { Foo myBar = "Hello, world!"_foo; // ctor via user defined literal OK Foo myBar2 = myBar; // copy-ctor OK Foo myBar3 = std::move(myBar2); // move-ctor OK my
Foo
,我想要求用户通过我的用户定义文本实例化它(默认的复制、移动和分配都可以):
举个例子,我想要这样的东西:
int main()
{
Foo myBar = "Hello, world!"_foo; // ctor via user defined literal OK
Foo myBar2 = myBar; // copy-ctor OK
Foo myBar3 = std::move(myBar2); // move-ctor OK
myBar = myBar3; // assignment OK
Foo myBaz{"Hello, world!", 42}; // ERROR: Must go through the user defined literal
Foo myBaz2; // ERROR: Default ctor not allowed
}
但是,通过上面的代码,我得到了以下编译错误(Xcode 4.6.3/Clang):
main.cpp:88:12:错误:没有用于初始化“::Foo”的匹配构造函数
返回Foo{str,MyFunc(str,n)};
^ ~~~~~~~~~~~~~~~~~~~~~
main.cpp:60:5:注意:候选构造函数不可行:需要0个参数,但提供了2个
Foo()=删除;
^
main.cpp:57:8:注意:候选构造函数(隐式副本构造函数)不可行:需要1个参数,但提供了2个
结构Foo
^
main.cpp:57:8:注意:候选构造函数(隐式移动构造函数)不可行:需要1个参数,但提供了2个
如何为业务重新打开{}-ctor,但仅为用户定义的文本重新打开?您目前没有双参数构造函数:
您目前没有双参数构造函数:
您目前没有双参数构造函数:
您目前没有双参数构造函数:
就像任何工厂函数一样——给类一个私有构造函数,让工厂成为朋友?@IgorTandetnik我试过了,但编译器(Xcode 4.6.3的clang++)当时找不到匹配的构造函数进行初始化。我已经用我的代码和我得到的错误更新了这个问题。字符串文本运算符必须有两个参数-指向字符串的指针和字符串的长度。就像任何工厂函数一样——给类一个私有构造函数,让工厂成为朋友?@IgorTandetnik我试过了,但编译器(Xcode 4.6.3的clang++)当时找不到匹配的构造函数进行初始化。我已经用我的代码和我得到的错误更新了这个问题。字符串文本运算符必须有两个参数-指向字符串的指针和字符串的长度。就像任何工厂函数一样——给类一个私有构造函数,让工厂成为朋友?@IgorTandetnik我试过了,但编译器(Xcode 4.6.3的clang++)当时找不到匹配的构造函数进行初始化。我已经用我的代码和我得到的错误更新了这个问题。字符串文本运算符必须有两个参数-指向字符串的指针和字符串的长度。就像任何工厂函数一样——给类一个私有构造函数,让工厂成为朋友?@IgorTandetnik我试过了,但编译器(Xcode 4.6.3的clang++)当时找不到匹配的构造函数进行初始化。我已经用我的代码和我得到的错误更新了这个问题。字符串文本运算符必须有两个参数-指向字符串的指针和字符串的长度。当我从
Foo
中删除private:
时,所有的编译都不会出错。为什么我可以对你在这种情况下提到的构造函数含蓄,但当我开始制作类型的其他部分private
?一旦你添加private:
,Foo
就不再是一个聚合。括号初始值设定项对于聚合(直接初始化每个成员)的行为与非聚合(调用合适的构造函数)的行为不同。感谢您的解释,这非常有用。当我从Foo
中删除private:
时,所有内容都编译无误。为什么我可以对你在这种情况下提到的构造函数含蓄,但当我开始制作类型的其他部分private
?一旦你添加private:
,Foo
就不再是一个聚合。括号初始值设定项对于聚合(直接初始化每个成员)的行为与非聚合(调用合适的构造函数)的行为不同。感谢您的解释,这非常有用。当我从Foo
中删除private:
时,所有内容都编译无误。为什么我可以对你在这种情况下提到的构造函数含蓄,但当我开始制作类型的其他部分private
?一旦你添加private:
,Foo
就不再是一个聚合。括号初始值设定项对于聚合(直接初始化每个成员)的行为与非聚合(调用合适的构造函数)的行为不同。感谢您的解释,这非常有用。当我从Foo
中删除private:
时,所有内容都编译无误。为什么我可以对你在这种情况下提到的构造函数含蓄,但当我开始制作类型的其他部分private
?一旦你添加private:
,Foo
就不再是一个聚合。括号初始化器对于聚合(直接初始化每个成员)的行为与非聚合(调用合适的构造函数)的行为不同。感谢您的解释,这非常有帮助。
int main()
{
Foo myBar = "Hello, world!"_foo; // ctor via user defined literal OK
Foo myBar2 = myBar; // copy-ctor OK
Foo myBar3 = std::move(myBar2); // move-ctor OK
myBar = myBar3; // assignment OK
Foo myBaz{"Hello, world!", 42}; // ERROR: Must go through the user defined literal
Foo myBaz2; // ERROR: Default ctor not allowed
}
main.cpp:88:12: error: no matching constructor for initialization of '<anonymous>::Foo'
return Foo{str, MyFunc(str, n)};
^ ~~~~~~~~~~~~~~~~~~~~~
main.cpp:60:5: note: candidate constructor not viable: requires 0 arguments, but 2 were provided
Foo() = delete;
^
main.cpp:57:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
struct Foo
^
main.cpp:57:8: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided
struct Foo
{
private:
const char* var1;
std::size_t var2;
friend constexpr Foo operator"" _foo (const char* v, std::size_t len);
constexpr Foo(const char* param1, std::size_t param2) : var1(param1), var2(param2) {}
};