使用real()与imag()为std::complex<float>类型变量赋值时出现编译错误的技术求助
解决std::complex实部虚部赋值的编译错误
嘿,这个问题我之前也碰到过!你遇到的编译错误根源很清晰:你调用的std::real和std::imag是标准库的自由函数,它们返回的是复数实部/虚部的值拷贝(也就是右值),而赋值操作要求左边必须是能被修改的左值(比如变量、可修改的引用),所以编译器才会抛出"lvalue required as left operand of assignment"的错误。
下面给你几种靠谱的解决方案,按推荐程度排个序:
方案1:用std::complex的成员函数设置值
这是最规范、可读性最高的做法,std::complex类本身就提供了专门修改实部和虚部的成员函数:
for ( int i = 0; i < nf; i++ ) { tempComplex[ i ].real(0.0f); tempComplex[ i ].imag(0.0f); }
直接调用成员函数real(val)和imag(val)就能完成赋值,完全符合C++标准的设计意图。
方案2:直接赋值默认构造的复数对象
因为std::complex的默认构造函数会自动把实部和虚部初始化为0,所以你可以直接给数组元素赋值一个默认对象,代码更简洁:
for ( int i = 0; i < nf; i++ ) { tempComplex[ i ] = std::complex<float>(); }
如果你的编译器支持C++11及以上,还能写成更短的统一初始化形式:
tempComplex[ i ] = {};
方案3:(不推荐)用std::ref获取左值引用
如果你非要坚持用std::real和std::imag函数,可以通过std::ref把复数对象包装成引用,让函数返回左值引用,这样就能赋值了:
#include <functional> // 别忘了包含这个头文件 for ( int i = 0; i < nf; i++ ) { real(std::ref(tempComplex[ i ])) = 0.0f; imag(std::ref(tempComplex[ i ])) = 0.0f; }
这个方法虽然能跑,但可读性远不如前两种,不建议在生产代码里这么写。
最后补个小技巧:如果你在创建数组的时候就想把所有元素初始化为0,其实可以在new的时候加个()`:
tempComplex = new std::complex<float>[ nf ]();
这样数组里的每个complex对象都会被默认构造(实部虚部都是0),直接省去后续的循环赋值,既高效又简洁。
内容的提问来源于stack exchange,提问作者Digger
相关产品推荐
相关产品推荐

