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++11 如何要求类型通过用户定义的文本?_C++11_Constructor_Initializer List_Constexpr_User Defined Literals - Fatal编程技术网

C++11 如何要求类型通过用户定义的文本?

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

我有一个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
    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) {}
};