• Status: Solved
• Priority: Medium
• Security: Public
• Views: 285

typename T - statement return Element < T()

Question with regard to the typename T in this statement  'return Elem < T()'.  The typename per the example is 'int' hence the return statement equates to "return Elem < int()".    For Elem 3, we have " return 3 < int() " but I'm confused on what the default construction call for the built in type - in this case - int() equates to?   ie.  "return 3 < ???"

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

using namespace std;

// [Predicate] object.
struct RemoveLessThanZero
{
template<typename T>
bool operator()( const T& Elem ) const
{
return Elem < T();
}
};

int main()
{
int Array[] = { 3, 2, 1, 0, -1, -2, -3, -4 };

// Calculate the size of the array.
static const std::size_t
NrElems( sizeof Array / sizeof* Array );

// Construct the vector with the 'Array' elements.
std::vector<int> V( Array, Array + NrElems );

// Print the contents of the vector to stdout.
std::copy( V.begin(), V.end(),
std::ostream_iterator<int>( std::cout, " " ) );

// Remove all negative values from the vector, with
// the help of our [Predicate] object.
V.erase( std::remove_if( V.begin(), V.end(),
RemoveLessThanZero() ), V.end() );

// Sort the vector elements prior to printing.
std::sort( V.begin(), V.end() );
std::cout << std::endl;

// Again, print the contents of the vector to stdout.
std::copy( V.begin(), V.end(),
std::ostream_iterator<int>( std::cout, " " ) );

return 0;
}
0
forums_mp
• 3
• 3
• 2
• +1
2 Solutions

Commented:
I guess int() calls int constructor which creates int instance and sets it to 0. 3 < int() is like 3 < 0.

Line
i = int();

looks in Disassembly window by the following way:

22:       i = int();
004114DF   mov         dword ptr [ebp-4],0

This means, i = 0.

Other test:

class A
{
public:
A()
{
cout << "A" << endl;
}
};

A a;
a = A();

Result is:
A
A

0

Commented:
>>>> return Elem < int()".

That statement compiles but doesn't work for build-in types. So, i would call it a bug. T() creates a new int in your case, that isn't initialized --> the result is undefined.

To make it work, you have to define a member variable of type T that takes an 'empty' or 'zero' instance of type T. You can pass the empty value by the constructor or - more usual - by providing a separate init or set function. The statement above then turns to

return Elem < m_empty;

Regards, Alex

0

Commented:
>>>> I guess int() calls int constructor which creates int instance and sets it to 0

No, only VC Debugger initializes 'new' instances with zeroes. There is no 'int' constructor in C++.

Regards, Alex

0

Author Commented:

>> So, i would call it a bug.
A bug considering the output made sense on repeated runs ..

>>> To make it work, you have to define a member variable of type T that takes an 'empty' or 'zero' instance of type T. You can pass the empty value by the constructor or - more usual - by providing a separate init or set function. The statement above then turns to

For instance.
0

Commented:
It's deja vu all over again...

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21031400.html

Summarizing:  A plain old data object whose initializer is an empty set of parentheses should be zero-initialized, as the first Alex said.  However, there are compilers that don't do this right.

--efn
0

Author Commented:

efn

The issue is not default initilization.  I understand that.  I realized though that I've interpreted the call to  V.erase/remove_if incorrectly.   The comparision is
3 < 0
2 < 0
:
:
-4 < 0

For some reason I thought (momentary insanity i suppose :)) about an element by element comparison and was trying to figure out how T() fit in..
0

Commented:
>> No, only VC Debugger initializes 'new' instances with zeroes.

Debugger ??
0

Commented:
>> Debugger ??

I meant VC Built in 'Debug Configuration'
0

Commented:
Program built by Microsoft VC++ compiler in Debug Configuration.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.