相关疑难解决方法(0)

可以在头文件中使用lambda违反ODR吗?

可以在头文件中写入以下内容:

inline void f () { std::function<void ()> func = [] {}; }
Run Code Online (Sandbox Code Playgroud)

要么

class C { std::function<void ()> func = [] {}; C () {} };
Run Code Online (Sandbox Code Playgroud)

我想在每个源文件中,lambda的类型可能不同,因此包含的类型std::function(target_type的结果会有所不同).

这是一个ODR(一个定义规则)违规,尽管看起来像一个共同的模式和合理的事情?第二个示例是每次都违反ODR还是仅在头文件中至少有一个构造函数?

c++ lambda one-definition-rule language-lawyer c++11

68
推荐指数
2
解决办法
4182
查看次数

哪些贪婪的初始化列表示例潜伏在标准库中?

从C++ 11开始,标准库容器和std::string构造函数都采用初始化列表.这个构造函数优先于其他构造函数(甚至,正如@ JohannesSchaub-litb在评论中指出的那样,甚至忽略了其他"最佳匹配"标准).当将所有带括号()的构造函数转换为其支撑版本时,这会导致一些众所周知的陷阱{}

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>

void print(std::vector<int> const& v)
{
    std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, ","));
    std::cout << "\n";
}

void print(std::string const& s)
{
    std::cout << s << "\n";
}

int main()
{
    // well-known 
    print(std::vector<int>{ 11, 22 });  // 11, 22, not 11 copies of 22
    print(std::vector<int>{ 11 });      // 11,     not 11 copies of 0

    // more surprising
    print(std::string{ 65, 'C' });      // AC,     not 65 …
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++11 list-initialization

13
推荐指数
1
解决办法
991
查看次数