C++ 可以使用C++;11';s';自动';降低性能甚至破坏代码?

C++ 可以使用C++;11';s';自动';降低性能甚至破坏代码?,c++,c++11,lazy-evaluation,auto,C++,C++11,Lazy Evaluation,Auto,此问题与现有问题“”相反 对这个问题的回答表明,使用auto不仅会产生积极的影响,还会产生消极的影响 我认为我们需要一个单独的问题,答案集中在auto和auto之间,变量声明+初始化行没有转换。但是,如果这种转换无论如何都必须发生,那么最好在初始化期间发生一次,而不是在以后多次 struct X { ... }; struct Y { operator X() const; ... }; Y foo(); // maybe, originally its return

此问题与现有问题“”相反

对这个问题的回答表明,使用
auto
不仅会产生积极的影响,还会产生消极的影响


我认为我们需要一个单独的问题,答案集中在
auto

auto
之间,变量声明+初始化行没有转换。但是,如果这种转换无论如何都必须发生,那么最好在初始化期间发生一次,而不是在以后多次

struct X {
    ...
};

struct Y {
    operator X() const;
    ...
};

Y foo(); // maybe, originally its return type was X but later was changed to Y
void bar(const X& );

const auto x = foo();           // <-- conversion not happening here
                                //
for ( int i = 0; i < 100; ++i ) //
    bar(x);                     // <-- silently rages here

您的问题标题指定了“性能”

auto
是一种编译时构造,允许用推断类型替换自身。它的使用不会导致不同的机器指令,如果你手写了它推断出的类型名称

问题在于,在管理性能时,类型规范和类型转换通常是至关重要的,而
auto
可以隐藏导致程序员说出与预期不同的内容:

std::vector<std::array<BigStruct, 10000>>& f();
auto va = f();  // copy
for (auto v: va) {  // copies
    // ...
}
这里存在性能影响,但这不是由
auto
引起的,而是(意外地)显式指定副本的副作用

auto
并不意味着
与此相同
它意味着
的一个实例

auto va = f();   // an instance-of what f returns, thus a copy.
auto& va = f();  // a reference to an instance-of, thus by reference.

无论何时使用带括号的初始化,通过auto盲目搜索和替换所有类型声明都会令人头痛:

class Point
{
public:
    Point (int x1, int y1) { x = x1; y = y1; }
private:
    int x, y;
};      

int main() 
{
    Point p{5, 6};
    auto q{5, 6}; // Error. Uniform initialization is not REALLY uniform
}

变量p的第一个声明被正确地推导为对接受两个整数的构造函数的调用。但是auto变量q搜索需要std::initializer\u list
的构造函数,因此无法编译

无意识地用
auto
搜索并替换所有变量声明符几乎肯定会破坏代码。考虑
cv
和ref限定符。普通的
auto
通常与
cv
或ref-qualified
auto
不同。。。。考虑一下
auto
不会影响重载解析和模板实例化的转换<代码>长x=1;库特
for (std::array<BigStruct, 10000> v : va)
auto& va = f();  // reference
for (auto& v : va) {  // references
auto va = f();   // an instance-of what f returns, thus a copy.
auto& va = f();  // a reference to an instance-of, thus by reference.
class Point
{
public:
    Point (int x1, int y1) { x = x1; y = y1; }
private:
    int x, y;
};      

int main() 
{
    Point p{5, 6};
    auto q{5, 6}; // Error. Uniform initialization is not REALLY uniform
}