C++ C++;-教授对类实例化的特定示例的困惑

C++ C++;-教授对类实例化的特定示例的困惑,c++,class,instantiation,C++,Class,Instantiation,我的教授给出了以下代码: Main.cpp 我在课堂上问过他这个问题,他说这是有效的C++,而且应该是可行的。我以前从未见过此类类实例化,它必须从字符串文本转换为std::string,然后将其转换为状态对象 我的教授接着指出,还有其他类似的调用非常接近: State y = "s2"; // Does NOT compile State y("s2"); // Does compile State y = string(

我的教授给出了以下代码:

Main.cpp 我在课堂上问过他这个问题,他说这是有效的C++,而且应该是可行的。我以前从未见过此类类实例化,它必须从字符串文本转换为
std::string
,然后将其转换为
状态
对象

我的教授接着指出,还有其他类似的调用非常接近:

State y = "s2";         // Does NOT compile
State y("s2");          // Does compile
State y = string("s2"); // Does compile

这是怎么回事?为什么第一个不编译,而第二个和第三个编译?还有,我的教授说第一句话应该行得通,是不是说错了?还是编译器特有的行为?

看起来您的
状态
对象有一个接受
字符串
的构造函数。文本
“s2”
是类型
常量字符[3]
。这就是您收到错误的原因

它也是特定于编译器的。以下代码段适用于,但不适用于:


我们需要查看
state.h
只能应用一个用户定义的转换。我的教授接着指出,还有其他相当接近的调用是非常接近的。如果你认为“C++”不是“C++”的话,那么你的教授听起来就好像C++是他们的主要编程语言。如果不完全相同,则不完全相同。
State y=“s2”
状态y(“s2”)不是等效的。第一个是“复制初始化”,第二个是“直接初始化”。最有可能的是,在教授的任何编译器设置上,它都会将其升级为字符串或其他非标准的向上转换,用于
=
运算符。文本
“s2”
是type
const char[3]
,正如错误消息中明确规定的那样。此外,这个答案并不能解释为什么当对象采用
字符串时,文本不起作用,我知道这是错误的。在我编译程序之前,我认为它是奇特的,并且不认为它是有效的C++。有没有人知道为什么我的教授会说它是有效的C++,应该编译?是否有允许此操作的编译器标志(如果有,它们是什么/我将在哪里查找该信息)?是否有其他编译器可以在其下工作(我知道他主要在自己的计算机上使用Red Hat,并且可能已经在那里进行了测试)?是的,可以。如果尚未定义
const char*
赋值操作,则赋值运算符从字符串文字(
const char*
string
的隐式转换是特定于编译器的,
const char*
赋值操作
State st(“a”)
工作起来很奇怪,但是
State st=“a”
没有,因此一些编译器可能允许它作为扩展,这是可以理解的。
#ifndef STATE_H
#define STATE_H
#include <string>

using namespace std;


class State
{
private:
    string* name; // str pointer used for illustrative purposes
    static int number_of_states;

public:
    State();
    State(string state_name);
    State(const State& state); // Will basically be the copy constructor
    virtual ~State();
    State& operator=(const State& state); // Copy on equal
    void get_name(string& state_name) const; 
    void set_name(string state_name);
    static int total_number_of_states();
};
typedef State *State_pointer;

#endif
$ g++ example_main_1.cpp state.cpp
example_main_1.cpp: In function ‘int main(int, const char**)’:
example_main_1.cpp:14:12: error: conversion from ‘const char [3]’ to non-scalar type ‘State’ requested
  State y = "s2"; // This doesn't compile
State y = "s2";         // Does NOT compile
State y("s2");          // Does compile
State y = string("s2"); // Does compile
struct State
{
    State(string s) { }
};

int main() {
    State s = "a";
}