C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| #import <iostream> #import <sstream> #import <functional> typedef std::function<void(std::ostringstream &)> foo_handler; class foo { public: foo(const foo_handler & handler) { handler(content_); } template<class T> foo(const T & fragment) { content_ << fragment; } const std::string str() const { return content_.str(); } private: std::ostringstream content_; }; void foo_a() { foo a([] (std::ostringstream & out) { out << "A says: Hello, world!"; }); std::cout << a.str() << std::endl; } void foo_b() { foo_handler handler([] (std::ostringstream & out) { out << "B says: Hello, world!"; }); foo b(handler); std::cout << b.str() << std::endl; } int main() { foo_a(); foo_b(); } |
Mijn output:
1
B says: Hello, world!
Verwachte output:
A says: Hello, world!
B says: Hello, world!
Commandline
$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
$ g++ -o sample -Wall -Wextra -std=c++11 -Ofast sample.cpp && ./sample
1
B says: Hello, world!
$
Waarom werkt foo_b wel goed en foo_a niet? Ik wil graag de lambda direct kunnen meegeven bij de constructor van foo. Ik verwacht dat er hier een soort implicit typecast gaande is waarbij de ene keer voorkeur is voor de "eerste" constructor en bij de andere keer voor de templated-constructor.
Wat moet ik doen om de code binnen foo_a te laten werken zonder de code binnen foo_a significant te veranderen?
[ Voor 14% gewijzigd door Gamebuster op 04-05-2015 20:46 ]
Let op: Mijn post bevat meningen, aannames of onwaarheden