由代码中的clang 3.5.0和gcc 4.9.1生成的可执行文件
#include <iostream>
struct Foo
{
Foo() { std::cout << "Foo()" << std::endl; }
Foo(int x) { std::cout << "Foo(int = " << x << ")" << std::endl; }
Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; }
};
int main() // Output
{ // ---------------------
auto a = Foo(); // Foo()
auto b = Foo(1); // Foo(int = 1)
auto c = …Run Code Online (Sandbox Code Playgroud) c++ language-lawyer value-initialization list-initialization c++14
给定
struct E
{
};
struct P
{
explicit P(E) {}
};
struct L
{
operator E() {return {};}
operator P() {return P{E{}};}
};
Run Code Online (Sandbox Code Playgroud)
根据C ++ 17语言标准,该表达式应该P{L{}}编译吗?
不同的编译器产生不同的结果:
使用clang 3.5.0和gcc 4.9.1编译以下代码会在最后一个语句中产生错误.
#include <iostream>
struct Foo { Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; } };
void bar(int x, int y) { std::cout << "bar(int = " << x << ", int = " << y << ")" << std::endl; }
int main()
{
Foo({}, {}); // Foo(int = 0, int = 0)
Foo({1}, {2}); // Foo(int = 1, int = 2)
Foo({1, …Run Code Online (Sandbox Code Playgroud)