小编Ray*_*mel的帖子

增加在初始化列表中使用两次的变量 - 未定义的行为?

编辑:尚未回答 - 链接的问题是关于普通的r值,初始化列表是一个单独的,如果相关的概念.

这个语句定义得很好,或者在初始化列表中使用前缀增量运算符,对于在列表中出现两次的变量,未定义的行为?

struct T t = { i, ++i };
Run Code Online (Sandbox Code Playgroud)

我对ANSI C最感兴趣,但知道其他版本的C和/或C++是否有所不同也很有用.如果类似以下的类似结构是合法的:

struct T t = { i, i++ };

struct T t = { ++i, ++i };

struct T t = { i++, ++i };

struct T t = { i++, i++ };
Run Code Online (Sandbox Code Playgroud)

c c++ initializer undefined-behavior

16
推荐指数
3
解决办法
800
查看次数

好的,使用带有移动的std :: string的std :: getline()?

是否安全且定义良好,第二个参数std::getline(std::istream&, std::string&)是一个引用移动的左值std::string,如果是,则该字符串是从其移出状态恢复的,因此pop_back()可以安全地调用诸如此类的方法?

更简单地说,写入getline()具有等效语义的字符串是否可以分配给该字符串?

或者更具体地说,以下(有点人为的)片段是否定义明确且正确?

std::ifstream f("foo.txt");

std::vector<std::string> lines;

for (std::string s; std::getline(f, s); lines.push_back(std::move(s)))
        if (!s.empty() && s.back() == '\r')
                s.pop_back();
Run Code Online (Sandbox Code Playgroud)

-march=native -O3这个片段的优化()版本使用g++并且clang++似乎按预期工作,但这当然不能保证.

我想知道这是否仅依赖于根据getline()C++ 11标准中语义的明确定义的行为,或者,如果不是,它是否由更高版本的标准明确定义,或者,如果不,如果它至少由任何/所有主要实现(G ++,Clang ++,Visual C++,英特尔C++编译器)明确定义.

注意:这不是先前问题的重复,询问是否可以安全地分配给移动的对象(是的,如果它是一个普通的或STL类型),因为getline()它不是赋值运算符.

c++ stl c++11 c++14 c++17

8
推荐指数
2
解决办法
506
查看次数

标签 统计

c++ ×2

c ×1

c++11 ×1

c++14 ×1

c++17 ×1

initializer ×1

stl ×1

undefined-behavior ×1