C ++ 11自动变量

时间:2015-07-10 12:05:25

标签: c++ c++11

Essentials of Modern C++ Style (video)中,Herb Sutter提倡:

import pandas as pd
import numpy as np
import scipy as sp

s = pd.Series([np.nan, np.nan, 1, np.nan, 3, np.nan, np.nan])

# interpolate using scipy
# ===========================================
s_no_nan = s.dropna()
func = sp.interpolate.interp1d(s_no_nan.index.values, s_no_nan.values, kind='linear', bounds_error=False)
s_interpolated = pd.Series(func(s.index), index=s.index)

Out[107]: 
0   NaN
1   NaN
2     1
3     2
4     3
5   NaN
6   NaN
dtype: float64

# extrapolate using user-defined func
# ===========================================
def my_extrapolate_func(scipy_interpolate_func, new_x):
    x1, x2 = scipy_interpolate_func.x[0], scipy_interpolate_func.x[-1]
    y1, y2 = scipy_interpolate_func.y[0], scipy_interpolate_func.y[-1]
    slope = (y2 - y1) / (x2 - x1)
    return y1 + slope * (new_x - x1)

s_extrapolated = pd.Series(my_extrapolate_func(func, s.index.values), index=s.index)

Out[108]: 
0   -1
1    0
2    1
3    2
4    3
5    4
6    5
dtype: float64

而不是

auto varname = Constructor{ ... };

我尝试过:

Constructor varname( ... );

但收到了auto log = fstream{"log.txt", fstream::out}; 关于已删除功能的错误消息(无论是否使用大括号或括号)。

是我的错还是g ++?

g++4.8 -std=c++11

工作正常。

MCVE:

fstream log{"log.txt", fstream::out};

错误:

#include <fstream>

using namespace std;
int main(int argc, char **argv)
{
    auto log = fstream{"log.txt", fstream::out};
    //fstream log{"log.txt", fstream::out};
    log << "hello world" << endl;
}

2 个答案:

答案 0 :(得分:4)

auto var = Type{...};语法要求Type可移动构造,但gcc在GCC 5.1之前不实现可移动的fstream。您的代码compiles with GCC 5.1

答案 1 :(得分:1)

如果我没有错,那么建议来自Herb Sutter。

显然,问题是由于您无法复制构造std::fstreamstd::fstream的复制构造函数标记为delete)。但是,直观地说,由于右手边有临时值,因此应该使用move-constructor而不是copy-constructor。

事实上,以下编译在clang(clang++ -std=c++11,OS X Mavericks)上很好:

#include <iostream>
#include <fstream>

int main() {

auto log = std::fstream{"test.cpp", std::fstream::out};

}