V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AscenZ
V2EX  ›  C

有用 Clion 的吗?话说为什么 swap( ) 不起作用?

  •  
  •   AscenZ · 2016-08-08 18:33:43 +08:00 · 2566 次点击
    这是一个创建于 3008 天前的主题,其中的信息可能已经有所发展或是发生改变。

    OS X10.11,CLion1.2.2,Xocde7 今天写一些小练习用到了 swap( ),但是没反应,是跟 CMake 之类的有关系吗?运行和调试都一样 2016-08-08_18:28:38.jpg 然后我用 Xcode 试了一下,完全没问题啊,换了 GNU 和 LLVM 都试了一下,都没问题 2016-08-08_18:29:25.jpg

    话说 CLion 跟 Xcode 编译有区别吗?对 CMake , LLVM 那些了解略少

    18 条回复    2016-08-09 11:44:16 +08:00
    ljcarsenal
        1
    ljcarsenal  
       2016-08-08 18:44:44 +08:00 via Android   ❤️ 1
    Swap 定义是啥……多年不写 cpp 了 swap 难道成为 iostream 的标准库函数了?
    kingddc314
        2
    kingddc314  
       2016-08-08 18:58:32 +08:00 via Android   ❤️ 1
    没加 C++11 编译选项吧
    AscenZ
        3
    AscenZ  
    OP
       2016-08-08 19:03:54 +08:00
    @ljcarsenal
    这个 swap 用的是 std 里面的吧

    @kingddc314
    不是啊,前面有用到挺多 11 的特性的

    最后,我也不知道是什么问题,我重新建 了个项目然后编译就交换了,重新打开这个项目就是不行,尴尬
    shyling
        4
    shyling  
       2016-08-08 19:05:20 +08:00
    我怎么记得好多源码里的 swap 都是自己写的。。。
    Guaidaodl
        5
    Guaidaodl  
       2016-08-08 19:07:33 +08:00
    话说根据我浅薄的 C++知识告诉我, 你传的不是指针也不是引用. 不可能交换成功的.
    Troevil
        6
    Troevil  
       2016-08-08 19:09:39 +08:00
    传的是值吧.. 又不是指针或引用
    kingddc314
        7
    kingddc314  
       2016-08-08 19:11:08 +08:00 via Android   ❤️ 1
    @Guaidaodl 传不传引用是看不出来的,得看函数实现。。

    @AscenZ 这确实是 C++11 才有的 std:: swap 函数
    AscenZ
        8
    AscenZ  
    OP
       2016-08-08 19:13:24 +08:00
    @Guaidaodl
    。。。。。。
    我重新建了个项目就成功了, Xcode 也能成功,原项目的问题,具体什么问题我也不太清楚
    swap 有很多种啊
    ![2016-08-08_19:12:34.jpg]( http://7xsnb0.com1.z0.glb.clouddn.com/2016-08-08_19:12:34.jpg)
    Guaidaodl
        9
    Guaidaodl  
       2016-08-08 19:14:19 +08:00
    @kingddc314 也是, 太久没有写 CPP 了.
    AscenZ
        10
    AscenZ  
    OP
       2016-08-08 19:15:19 +08:00
    @kingddc314 好吧,但是跟这个关系不大,前面用了挺多 c++11 的特性都没问题
    hitmanx
        11
    hitmanx  
       2016-08-08 19:54:45 +08:00
    话说你试过如果特化一个 swap 加到 std 里能过吗?
    namespace std{
    template<>
    void swap<int>(int&a , int&b)
    {
    ...
    }
    }
    hitmanx
        12
    hitmanx  
       2016-08-08 20:07:36 +08:00   ❤️ 1
    刚才拿 clion 试了下,好像没发现这个问题. cmake 中在创建新项目时默认已经加了"-std=c++11"的编译选项,但是我试了下把它拿掉也可以正常编译和运行。查了下 cppreference ( http://en.cppreference.com/w/cpp/algorithm/swap ),和我记忆中是一样的,这种 POD 类型的 swap 支持并不需要 c++11 的,因为这种类型就是一个很简单的默认的以值方式的三次拷贝就能实现,似乎并没有什么特化提升的余地,大概像:

    namespace std{

    template <typename T>
    void swap(T& val1, T& val2)
    {
    T temp(val1);
    val1 = val2;
    val2 = temp;
    }

    }
    arrow2015
        13
    arrow2015  
       2016-08-08 21:54:45 +08:00 via Android
    @Guaidaodl 和你的想法一样。楼主这是怎么交换成功的
    lifanxi
        14
    lifanxi  
       2016-08-08 22:12:58 +08:00
    重现不了这个问题。
    楼主可以直接用 IDE 跟进 swap 函数看看是怎么定义的,或者 Debug 时单步跟踪进 swap 看看怎么回事。
    可能是原来的项目里有自己定义的一个 swap 函数覆盖了标准库里的?
    mxi1
        15
    mxi1  
       2016-08-08 22:29:04 +08:00
    @arrow2015 c++ algorithm namespace 定义了 swap 函数,它的参数是传引用的,不是传值的。
    msg7086
        16
    msg7086  
       2016-08-09 05:11:24 +08:00
    项目文件拿出来 diff 一下?
    tairan2006
        17
    tairan2006  
       2016-08-09 10:37:33 +08:00
    虽然很久没写 C++大致记得是传引用,楼主的写法没错。

    http://www.cplusplus.com/reference/algorithm/swap/
    cppgohan
        18
    cppgohan  
       2016-08-09 11:44:16 +08:00
    项目文件拿出来 diff 一下? +1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:32 · PVG 03:32 · LAX 12:32 · JFK 15:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.